Module: xenomai-jki
Branch: for-upstream
Commit: 82495b06788df4dbc0be95eded00e14be0797735
URL:    
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=82495b06788df4dbc0be95eded00e14be0797735

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Tue Mar  2 14:29:02 2010 +0100

POSIX: Fix in-kernel pthread_cond_[timed]wait

Make sure that we always try to reacquire the mutex, even if the
prologue failed. And return the epilogue error in case the prologue was
successful.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 ksrc/skins/posix/cond.c |   23 ++++++++++++-----------
 1 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/ksrc/skins/posix/cond.c b/ksrc/skins/posix/cond.c
index 1b74b80..78a7bed 100644
--- a/ksrc/skins/posix/cond.c
+++ b/ksrc/skins/posix/cond.c
@@ -412,7 +412,7 @@ int pthread_cond_wait(pthread_cond_t * cnd, pthread_mutex_t 
* mx)
            &((union __xeno_mutex *)mx)->shadow_mutex;
        xnthread_t *cur = xnpod_current_thread();
        unsigned count;
-       int err;
+       int err, epilogue_err;
 
 #ifdef CONFIG_XENO_FASTSYNCH
        if (unlikely(cb_try_read_lock(&mutex->lock, s)))
@@ -422,16 +422,16 @@ int pthread_cond_wait(pthread_cond_t * cnd, 
pthread_mutex_t * mx)
        err = pse51_cond_timedwait_prologue(cur, cond, mutex,
                                            &count, 0, XN_INFINITE);
 
-       if (!err || err == EINTR)
-               while (EINTR == pse51_cond_timedwait_epilogue(cur, cond,
-                                                             mutex, count))
-                       ;
+       do {
+               epilogue_err = pse51_cond_timedwait_epilogue(cur, cond,
+                                                            mutex, count);
+       } while (epilogue_err == -EINTR);
 
 #ifdef CONFIG_XENO_FASTSYNCH
        cb_read_unlock(&mutex->lock, s);
 #endif /* CONFIG_XENO_FASTSYNCH */
 
-       return err != EINTR ? err : 0;
+       return err != EINTR ? err : epilogue_err;
 }
 
 /**
@@ -480,7 +480,7 @@ int pthread_cond_timedwait(pthread_cond_t * cnd,
            &((union __xeno_mutex *)mx)->shadow_mutex;
        xnthread_t *cur = xnpod_current_thread();
        unsigned count;
-       int err;
+       int err, epilogue_err;
 
 #ifdef CONFIG_XENO_FASTSYNCH
        if (unlikely(cb_try_read_lock(&mutex->lock, s)))
@@ -490,16 +490,17 @@ int pthread_cond_timedwait(pthread_cond_t * cnd,
        err = pse51_cond_timedwait_prologue(cur, cond, mutex, &count, 1,
                                            ts2ticks_ceil(abstime) + 1);
 
-       if (!err || err == EINTR || err == ETIMEDOUT)
-               while (EINTR == pse51_cond_timedwait_epilogue(cur, cond,
-                                                             mutex, count))
+       do {
+               epilogue_err = pse51_cond_timedwait_epilogue(cur, cond,
+                                                            mutex, count);
+       } while (epilogue_err == -EINTR);
                        ;
 
 #ifdef CONFIG_XENO_FASTSYNCH
        cb_read_unlock(&mutex->lock, s);
 #endif /* CONFIG_XENO_FASTSYNCH */
 
-       return err != EINTR ? err : 0;
+       return err != EINTR ? err : epilogue_err;
 }
 
 /**


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to