aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/nptl/lowlevellock.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2014-07-07 09:28:38 -0700
committerRoland McGrath <roland@hack.frob.com>2014-07-07 09:28:38 -0700
commit08192659bbeae149e7cb1f4c43547257f7099bb0 (patch)
tree9f602a4e9f0aefdb06bc15a76be46e958e91a58f /sysdeps/nptl/lowlevellock.h
parent96baf6ffc57b811bbc424a1fc72ef77dd56d7a18 (diff)
downloadglibc-08192659bbeae149e7cb1f4c43547257f7099bb0.tar
glibc-08192659bbeae149e7cb1f4c43547257f7099bb0.tar.gz
glibc-08192659bbeae149e7cb1f4c43547257f7099bb0.tar.bz2
glibc-08192659bbeae149e7cb1f4c43547257f7099bb0.zip
Get rid of nptl/sysdeps/ entirely!
Diffstat (limited to 'sysdeps/nptl/lowlevellock.h')
-rw-r--r--sysdeps/nptl/lowlevellock.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/sysdeps/nptl/lowlevellock.h b/sysdeps/nptl/lowlevellock.h
new file mode 100644
index 0000000000..7d1913a58d
--- /dev/null
+++ b/sysdeps/nptl/lowlevellock.h
@@ -0,0 +1,83 @@
+/* Low level locking macros used in NPTL implementation. Stub version.
+ Copyright (C) 2002-2014 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <atomic.h>
+
+
+/* Mutex lock counter:
+ bit 31 clear means unlocked;
+ bit 31 set means locked.
+
+ All code that looks at bit 31 first increases the 'number of
+ interested threads' usage counter, which is in bits 0-30.
+
+ All negative mutex values indicate that the mutex is still locked. */
+
+
+static inline void
+__generic_mutex_lock (int *mutex)
+{
+ unsigned int v;
+
+ /* Bit 31 was clear, we got the mutex. (this is the fastpath). */
+ if (atomic_bit_test_set (mutex, 31) == 0)
+ return;
+
+ atomic_increment (mutex);
+
+ while (1)
+ {
+ if (atomic_bit_test_set (mutex, 31) == 0)
+ {
+ atomic_decrement (mutex);
+ return;
+ }
+
+ /* We have to wait now. First make sure the futex value we are
+ monitoring is truly negative (i.e. locked). */
+ v = *mutex;
+ if (v >= 0)
+ continue;
+
+ lll_futex_wait (mutex, v,
+ // XYZ check mutex flag
+ LLL_SHARED);
+ }
+}
+
+
+static inline void
+__generic_mutex_unlock (int *mutex)
+{
+ /* Adding 0x80000000 to the counter results in 0 if and only if
+ there are not other interested threads - we can return (this is
+ the fastpath). */
+ if (atomic_add_zero (mutex, 0x80000000))
+ return;
+
+ /* There are other threads waiting for this mutex, wake one of them
+ up. */
+ lll_futex_wake (mutex, 1,
+ // XYZ check mutex flag
+ LLL_SHARED);
+}
+
+
+#define lll_mutex_lock(futex) __generic_mutex_lock (&(futex))
+#define lll_mutex_unlock(futex) __generic_mutex_unlock (&(futex))