[Xenomai-git] Jan Kiszka : POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait
Module: xenomai-jki Branch: for-upstream Commit: 0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0 Author: Jan Kiszka jan.kis...@siemens.com Date: Sat Mar 6 09:30:20 2010 +0100 POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- include/posix/pthread.h|5 +++ include/posix/syscall.h|2 + ksrc/skins/posix/syscall.c | 82 ++ src/skins/posix/cond.c | 87 ++-- src/skins/posix/init.c |3 ++ 5 files changed, 153 insertions(+), 26 deletions(-) diff --git a/include/posix/pthread.h b/include/posix/pthread.h index 685b356..b4f9531 100644 --- a/include/posix/pthread.h +++ b/include/posix/pthread.h @@ -184,6 +184,11 @@ union __xeno_cond { } shadow_cond; }; +struct pse51_cond_wait_state { + unsigned count; + int prologue_err; +}; + struct pse51_interrupt; typedef struct pse51_interrupt *pthread_intr_t; diff --git a/include/posix/syscall.h b/include/posix/syscall.h index 04a528d..8bb64bd 100644 --- a/include/posix/syscall.h +++ b/include/posix/syscall.h @@ -104,6 +104,8 @@ #define __pse51_select77 #define __pse51_thread_setschedparam_ex78 #define __pse51_thread_getschedparam_ex79 +#define __pse51_cond_wait_prologue280 +#define __pse51_cond_wait_epilogue281 #ifdef __KERNEL__ diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c index 0032f4d..584708e 100644 --- a/ksrc/skins/posix/syscall.c +++ b/ksrc/skins/posix/syscall.c @@ -1512,13 +1512,14 @@ static int __pthread_cond_destroy(struct pt_regs *regs) cnd.shadow_cond, sizeof(ucnd-shadow_cond)); } -/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */ -static int __pthread_cond_wait_prologue(struct pt_regs *regs) +static int +__pthread_cond_wait_prologue_inner(struct pt_regs *regs, + struct pse51_cond_wait_state *state) { xnthread_t *cur = xnshadow_thread(current); union __xeno_cond cnd, *ucnd; union __xeno_mutex mx, *umx; - unsigned timed, count; + unsigned timed; struct timespec ts; int err, epilogue_err; @@ -1551,22 +1552,23 @@ static int __pthread_cond_wait_prologue(struct pt_regs *regs) err = pse51_cond_timedwait_prologue(cur, cnd.shadow_cond, mx.shadow_mutex, - count, + state-count, timed, ts2ticks_ceil(ts) + 1); } else err = pse51_cond_timedwait_prologue(cur, cnd.shadow_cond, mx.shadow_mutex, - count, timed, XN_INFINITE); + state-count, + timed, XN_INFINITE); - cur-errcode = err != EINTR ? err : 0; + state-prologue_err = err != EINTR ? err : 0; if (err == 0 || err == ETIMEDOUT) { epilogue_err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond, mx.shadow_mutex, - count); + state-count); if (epilogue_err != 0) err = epilogue_err; else if (__xn_safe_copy_to_user((void __user *) @@ -1575,17 +1577,45 @@ static int __pthread_cond_wait_prologue(struct pt_regs *regs) sizeof(umx-shadow_mutex.lockcnt))) return -EFAULT; } - - if (err == EINTR -__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), - count, sizeof(count))) - return -EFAULT; return -err; } -/* pthread_cond_wait_epilogue(cond, mutex, count) */ -static int __pthread_cond_wait_epilogue(struct pt_regs *regs) +/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */ +static int __pthread_cond_wait_prologue(struct pt_regs *regs) +{ + struct pse51_cond_wait_state state; + int err; + + err = __pthread_cond_wait_prologue_inner(regs, state); + + xnshadow_thread(current)-errcode = state.prologue_err; + + if (err == -EINTR +__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), +
[Xenomai-git] Jan Kiszka : POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait
Module: xenomai-jki Branch: queues/assorted Commit: 0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0 Author: Jan Kiszka jan.kis...@siemens.com Date: Sat Mar 6 09:30:20 2010 +0100 POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- include/posix/pthread.h|5 +++ include/posix/syscall.h|2 + ksrc/skins/posix/syscall.c | 82 ++ src/skins/posix/cond.c | 87 ++-- src/skins/posix/init.c |3 ++ 5 files changed, 153 insertions(+), 26 deletions(-) diff --git a/include/posix/pthread.h b/include/posix/pthread.h index 685b356..b4f9531 100644 --- a/include/posix/pthread.h +++ b/include/posix/pthread.h @@ -184,6 +184,11 @@ union __xeno_cond { } shadow_cond; }; +struct pse51_cond_wait_state { + unsigned count; + int prologue_err; +}; + struct pse51_interrupt; typedef struct pse51_interrupt *pthread_intr_t; diff --git a/include/posix/syscall.h b/include/posix/syscall.h index 04a528d..8bb64bd 100644 --- a/include/posix/syscall.h +++ b/include/posix/syscall.h @@ -104,6 +104,8 @@ #define __pse51_select77 #define __pse51_thread_setschedparam_ex78 #define __pse51_thread_getschedparam_ex79 +#define __pse51_cond_wait_prologue280 +#define __pse51_cond_wait_epilogue281 #ifdef __KERNEL__ diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c index 0032f4d..584708e 100644 --- a/ksrc/skins/posix/syscall.c +++ b/ksrc/skins/posix/syscall.c @@ -1512,13 +1512,14 @@ static int __pthread_cond_destroy(struct pt_regs *regs) cnd.shadow_cond, sizeof(ucnd-shadow_cond)); } -/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */ -static int __pthread_cond_wait_prologue(struct pt_regs *regs) +static int +__pthread_cond_wait_prologue_inner(struct pt_regs *regs, + struct pse51_cond_wait_state *state) { xnthread_t *cur = xnshadow_thread(current); union __xeno_cond cnd, *ucnd; union __xeno_mutex mx, *umx; - unsigned timed, count; + unsigned timed; struct timespec ts; int err, epilogue_err; @@ -1551,22 +1552,23 @@ static int __pthread_cond_wait_prologue(struct pt_regs *regs) err = pse51_cond_timedwait_prologue(cur, cnd.shadow_cond, mx.shadow_mutex, - count, + state-count, timed, ts2ticks_ceil(ts) + 1); } else err = pse51_cond_timedwait_prologue(cur, cnd.shadow_cond, mx.shadow_mutex, - count, timed, XN_INFINITE); + state-count, + timed, XN_INFINITE); - cur-errcode = err != EINTR ? err : 0; + state-prologue_err = err != EINTR ? err : 0; if (err == 0 || err == ETIMEDOUT) { epilogue_err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond, mx.shadow_mutex, - count); + state-count); if (epilogue_err != 0) err = epilogue_err; else if (__xn_safe_copy_to_user((void __user *) @@ -1575,17 +1577,45 @@ static int __pthread_cond_wait_prologue(struct pt_regs *regs) sizeof(umx-shadow_mutex.lockcnt))) return -EFAULT; } - - if (err == EINTR -__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), - count, sizeof(count))) - return -EFAULT; return -err; } -/* pthread_cond_wait_epilogue(cond, mutex, count) */ -static int __pthread_cond_wait_epilogue(struct pt_regs *regs) +/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */ +static int __pthread_cond_wait_prologue(struct pt_regs *regs) +{ + struct pse51_cond_wait_state state; + int err; + + err = __pthread_cond_wait_prologue_inner(regs, state); + + xnshadow_thread(current)-errcode = state.prologue_err; + + if (err == -EINTR +__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs), +