[Xenomai-git] Jan Kiszka : POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait

2010-03-06 Thread GIT version control
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

2010-03-06 Thread GIT version control
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),
+