From: Ulrich Drepper Date: Mon, 14 Dec 1998 16:33:50 +0000 (+0000) Subject: Update. X-Git-Tag: cvs/glibc-2_0_112~188 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fbaf6e72d676629c21d00eab5824571b1b26a2b2;p=thirdparty%2Fglibc.git Update. * spinlock.c (__pthread_unlock): Don"t crash if called for an untaken mutex. Reported by Ruslan V. Brushkoff . --- diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 554e0fb01d0..ae024013ff7 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,8 @@ 1998-12-14 Ulrich Drepper + * spinlock.c (__pthread_unlock): Don"t crash if called for an + untaken mutex. Reported by Ruslan V. Brushkoff . + * Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce overall runtime. diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 00a8691e5bc..c8f8f712939 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -65,9 +65,11 @@ void internal_function __pthread_unlock(struct _pthread_fastlock * lock) again: oldstatus = lock->__status; - if (oldstatus == 1) { - /* No threads are waiting for this lock */ - if (! compare_and_swap(&lock->__status, 1, 0, &lock->__spinlock)) + if (oldstatus == 0 || oldstatus == 1) { + /* No threads are waiting for this lock. Please note that we also + enter this case if the lock is not taken at all. If this wouldn't + be done here we would crash further down. */ + if (! compare_and_swap(&lock->__status, oldstatus, 0, &lock->__spinlock)) goto again; return; }