From 893a351195a2997133892ffac80573a9984ba4cf Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 18 May 2004 20:18:14 +0000 Subject: [BZ #163] Update. 2004-05-18 Petter Reinholdtsen * locales/sl_SI [LC_TIME]: Correct d_fmt date format from '22.06.2003' to '22. 06. 2003'. Change requested from Aleks Reinhardt, and approved by the locale author Borka Jerman-Blazic. [BZ #163] --- nptl/sysdeps/pthread/pthread_cond_broadcast.c | 5 ++++- nptl/sysdeps/pthread/pthread_cond_timedwait.c | 15 ++++++++++++++- nptl/sysdeps/pthread/pthread_cond_wait.c | 19 +++++++++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) (limited to 'nptl/sysdeps/pthread') diff --git a/nptl/sysdeps/pthread/pthread_cond_broadcast.c b/nptl/sysdeps/pthread/pthread_cond_broadcast.c index 44c3fe6d5f..a42c579658 100644 --- a/nptl/sysdeps/pthread/pthread_cond_broadcast.c +++ b/nptl/sysdeps/pthread/pthread_cond_broadcast.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky , 2003. @@ -40,6 +40,9 @@ __pthread_cond_broadcast (cond) { /* Yes. Mark them all as woken. */ cond->__data.__wakeup_seq = cond->__data.__total_seq; + cond->__data.__woken_seq = cond->__data.__total_seq; + /* Signal that a broadcast happened. */ + ++cond->__data.__broadcast_seq; /* We are done. */ lll_mutex_unlock (cond->__data.__lock); diff --git a/nptl/sysdeps/pthread/pthread_cond_timedwait.c b/nptl/sysdeps/pthread/pthread_cond_timedwait.c index a03f51e0f0..96b1029cf5 100644 --- a/nptl/sysdeps/pthread/pthread_cond_timedwait.c +++ b/nptl/sysdeps/pthread/pthread_cond_timedwait.c @@ -36,6 +36,7 @@ struct _condvar_cleanup_buffer int oldtype; pthread_cond_t *cond; pthread_mutex_t *mutex; + unsigned int bc_seq; }; int @@ -85,6 +86,8 @@ __pthread_cond_timedwait (cond, mutex, abstime) unsigned long long int val; unsigned long long int seq; val = seq = cond->__data.__wakeup_seq; + /* Remember the broadcast counter. */ + cbuffer.bc_seq = cond->__data.__broadcast_seq; /* The futex syscall operates on a 32-bit word. That is fine, we just use the low 32 bits of the sequence counter. */ @@ -139,7 +142,12 @@ __pthread_cond_timedwait (cond, mutex, abstime) } /* Did we already time out? */ if (__builtin_expect (rt.tv_sec < 0, 0)) - goto timeout; + { + if (cbuffer.bc_seq != cond->__data.__broadcast_seq) + goto bc_out; + + goto timeout; + } /* Prepare to wait. Release the condvar futex. */ lll_mutex_unlock (cond->__data.__lock); @@ -157,6 +165,10 @@ __pthread_cond_timedwait (cond, mutex, abstime) /* We are going to look at shared data again, so get the lock. */ lll_mutex_lock(cond->__data.__lock); + /* If a broadcast happened, we are done. */ + if (cbuffer.bc_seq != cond->__data.__broadcast_seq) + goto bc_out; + /* Check whether we are eligible for wakeup. */ val = cond->__data.__wakeup_seq; if (val != seq && cond->__data.__woken_seq != val) @@ -178,6 +190,7 @@ __pthread_cond_timedwait (cond, mutex, abstime) /* Another thread woken up. */ ++cond->__data.__woken_seq; + bc_out: /* We are done with the condvar. */ lll_mutex_unlock (cond->__data.__lock); diff --git a/nptl/sysdeps/pthread/pthread_cond_wait.c b/nptl/sysdeps/pthread/pthread_cond_wait.c index 01415bf051..a05060a107 100644 --- a/nptl/sysdeps/pthread/pthread_cond_wait.c +++ b/nptl/sysdeps/pthread/pthread_cond_wait.c @@ -32,6 +32,7 @@ struct _condvar_cleanup_buffer int oldtype; pthread_cond_t *cond; pthread_mutex_t *mutex; + unsigned int bc_seq; }; @@ -45,10 +46,13 @@ __condvar_cleanup (void *arg) /* We are going to modify shared data. */ lll_mutex_lock (cbuffer->cond->__data.__lock); - /* This thread is not waiting anymore. Adjust the sequence counters - appropriately. */ - ++cbuffer->cond->__data.__wakeup_seq; - ++cbuffer->cond->__data.__woken_seq; + if (cbuffer->bc_seq == cbuffer->cond->__data.__broadcast_seq) + { + /* This thread is not waiting anymore. Adjust the sequence counters + appropriately. */ + ++cbuffer->cond->__data.__wakeup_seq; + ++cbuffer->cond->__data.__woken_seq; + } /* We are done. */ lll_mutex_unlock (cbuffer->cond->__data.__lock); @@ -111,6 +115,8 @@ __pthread_cond_wait (cond, mutex) unsigned long long int val; unsigned long long int seq; val = seq = cond->__data.__wakeup_seq; + /* Remember the broadcast counter. */ + cbuffer.bc_seq = cond->__data.__broadcast_seq; /* The futex syscall operates on a 32-bit word. That is fine, we just use the low 32 bits of the sequence counter. */ @@ -137,6 +143,10 @@ __pthread_cond_wait (cond, mutex) /* Disable asynchronous cancellation. */ __pthread_disable_asynccancel (cbuffer.oldtype); + /* If a broadcast happened, we are done. */ + if (cbuffer.bc_seq != cond->__data.__broadcast_seq) + goto bc_out; + /* We are going to look at shared data again, so get the lock. */ lll_mutex_lock (cond->__data.__lock); @@ -148,6 +158,7 @@ __pthread_cond_wait (cond, mutex) /* Another thread woken up. */ ++cond->__data.__woken_seq; + bc_out: /* We are done with the condvar. */ lll_mutex_unlock (cond->__data.__lock); -- cgit v1.2.3-70-g09d2