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