Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 14 Dec 1998 16:33:50 +0000 (16:33 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 14 Dec 1998 16:33:50 +0000 (16:33 +0000)
* spinlock.c (__pthread_unlock): Don"t crash if called for an
untaken mutex.  Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>.

linuxthreads/ChangeLog
linuxthreads/spinlock.c

index 554e0fb..ae02401 100644 (file)
@@ -1,5 +1,8 @@
 1998-12-14  Ulrich Drepper  <drepper@cygnus.com>
 
+       * spinlock.c (__pthread_unlock): Don"t crash if called for an
+       untaken mutex.  Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>.
+
        * Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce
        overall runtime.
 
index 00a8691..c8f8f71 100644 (file)
@@ -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;
   }