about summary refs log tree commit diff
path: root/nptl/sysdeps/unix/sysv
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-03-02 00:25:56 +0000
committerUlrich Drepper <drepper@redhat.com>2006-03-02 00:25:56 +0000
commit42b6ddfca528a12ff7b4065e8ca8c2631d754260 (patch)
treed97dee2b539207dee491c0347a1e5ee78c67491d /nptl/sysdeps/unix/sysv
parentc99445f897367f658bb3c0da1cf5a8a8620931aa (diff)
downloadglibc-42b6ddfca528a12ff7b4065e8ca8c2631d754260.tar.gz
glibc-42b6ddfca528a12ff7b4065e8ca8c2631d754260.tar.xz
glibc-42b6ddfca528a12ff7b4065e8ca8c2631d754260.zip
(__lll_robust_lock_wait): Also set FUTEX_WAITERS buit if we got the mutex. (__lll_robust_timedlock_wait): Likewise.
Diffstat (limited to 'nptl/sysdeps/unix/sysv')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
index 1c516c7424..ff09745060 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
@@ -74,6 +74,7 @@ __lll_robust_mutex_lock_wait:
 	jne	4b
 
 	movl	%gs:TID, %edx
+	orl	$FUTEX_WAITERS, %edx
 	LOCK
 	cmpxchgl %edx, (%ebx)
 	jnz	4b
@@ -163,6 +164,7 @@ __lll_robust_mutex_timedlock_wait:
 	jne	7f
 
 	movl	%gs:TID, %edx
+	orl	$FUTEX_WAITERS, %edx
 	LOCK
 	cmpxchgl %edx, (%ebx)
 	jnz	7f
diff --git a/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c b/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
index b7faeaf257..3e88ee1866 100644
--- a/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
+++ b/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
@@ -42,7 +42,9 @@ __lll_robust_lock_wait (int *futex)
 
       lll_futex_wait (futex, newval);
     }
-  while ((oldval = atomic_compare_and_exchange_val_acq (futex, tid, 0)) != 0);
+  while ((oldval = atomic_compare_and_exchange_val_acq (futex,
+							tid | FUTEX_WAITERS,
+							0)) != 0);
   return 0;
 }
 
@@ -89,7 +91,7 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime)
 
       lll_futex_timed_wait (futex, newval, &rt);
     }
-  while (atomic_compare_and_exchange_bool_acq (futex, tid, 0));
+  while (atomic_compare_and_exchange_bool_acq (futex, tid | FUTEX_WAITERS, 0));
 
   return 0;
 }