summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h115
1 files changed, 3 insertions, 112 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h b/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h
index 6b3d3682da..4a49925588 100644
--- a/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h
+++ b/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h
@@ -1,5 +1,5 @@
/* Defintions for lowlevel handling in ld.so.
- Copyright (C) 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,115 +24,6 @@
#include <lowlevellock.h>
-/* Special multi-reader lock used in ld.so. */
-#define __RTLD_MRLOCK_WRITER 1
-#define __RTLD_MRLOCK_RWAIT 2
-#define __RTLD_MRLOCK_WWAIT 4
-#define __RTLD_MRLOCK_RBITS \
- ~(__RTLD_MRLOCK_WRITER | __RTLD_MRLOCK_RWAIT | __RTLD_MRLOCK_WWAIT)
-#define __RTLD_MRLOCK_INC 8
-#define __RTLD_MRLOCK_TRIES 5
-
-
-typedef int __rtld_mrlock_t;
-
-
-#define __rtld_mrlock_define(CLASS,NAME) \
- CLASS __rtld_mrlock_t NAME;
-
-
-#define _RTLD_MRLOCK_INITIALIZER 0
-#define __rtld_mrlock_initialize(NAME) \
- (void) ((NAME) = 0)
-
-
-#define __rtld_mrlock_lock(lock) \
- do { \
- __label__ out; \
- while (1) \
- { \
- int oldval; \
- for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries) \
- { \
- oldval = lock; \
- while (__builtin_expect ((oldval \
- & (__RTLD_MRLOCK_WRITER \
- | __RTLD_MRLOCK_WWAIT)) \
- == 0, 1)) \
- { \
- int newval = ((oldval & __RTLD_MRLOCK_RBITS) \
- + __RTLD_MRLOCK_INC); \
- int ret = atomic_compare_and_exchange_val_acq (&(lock), \
- newval, \
- oldval); \
- if (__builtin_expect (ret == oldval, 1)) \
- goto out; \
- oldval = ret; \
- } \
- atomic_delay (); \
- } \
- if ((oldval & __RTLD_MRLOCK_RWAIT) == 0) \
- { \
- atomic_or (&(lock), __RTLD_MRLOCK_RWAIT); \
- oldval |= __RTLD_MRLOCK_RWAIT; \
- } \
- lll_futex_wait (lock, oldval); \
- } \
- out:; \
- } while (0)
-
-
-#define __rtld_mrlock_unlock(lock) \
- do { \
- int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_INC); \
- if (__builtin_expect ((oldval \
- & (__RTLD_MRLOCK_RBITS | __RTLD_MRLOCK_WWAIT)) \
- == (__RTLD_MRLOCK_INC | __RTLD_MRLOCK_WWAIT), 0)) \
- /* We have to wake all threads since there might be some queued \
- readers already. */ \
- lll_futex_wake (&(lock), 0x7fffffff); \
- } while (0)
-
-
-/* There can only ever be one thread trying to get the exclusive lock. */
-#define __rtld_mrlock_change(lock) \
- do { \
- __label__ out; \
- while (1) \
- { \
- int oldval; \
- for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries) \
- { \
- oldval = lock; \
- while (__builtin_expect ((oldval & __RTLD_MRLOCK_RBITS) == 0, 1)) \
- { \
- int newval = ((oldval & __RTLD_MRLOCK_RWAIT) \
- + __RTLD_MRLOCK_WRITER); \
- int ret = atomic_compare_and_exchange_val_acq (&(lock), \
- newval, \
- oldval); \
- if (__builtin_expect (ret == oldval, 1)) \
- goto out; \
- oldval = ret; \
- } \
- atomic_delay (); \
- } \
- atomic_or (&(lock), __RTLD_MRLOCK_WWAIT); \
- oldval |= __RTLD_MRLOCK_WWAIT; \
- lll_futex_wait (lock, oldval); \
- } \
- out:; \
- } while (0)
-
-
-#define __rtld_mrlock_done(lock) \
- do { \
- int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_WRITER); \
- if (__builtin_expect ((oldval & __RTLD_MRLOCK_RWAIT) != 0, 0)) \
- lll_futex_wake (&(lock), 0x7fffffff); \
- } while (0)
-
-
/* Function to wait for variable become zero. Used in ld.so for
reference counters. */
#define __rtld_waitzero(word) \
@@ -142,12 +33,12 @@ typedef int __rtld_mrlock_t;
int val = word; \
if (val == 0) \
break; \
- lll_futex_wait (&(word), val); \
+ lll_futex_wait (&(word), val, LLL_PRIVATE); \
} \
} while (0)
#define __rtld_notify(word) \
- lll_futex_wake (&(word), 1)
+ lll_futex_wake (&(word), 1, LLL_PRIVATE)
#endif