summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-09-22 05:45:50 +0000
committerUlrich Drepper <drepper@redhat.com>2003-09-22 05:45:50 +0000
commitbc1989aad2a5246ea5d216546240609620451f87 (patch)
treed708ff3f97c49951c713cd6253ba8ceabcbcfa05 /nptl/sysdeps/unix/sysv
parent3a226d33012ec69a480ddb58940f2aaa3e24f059 (diff)
Update.
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. * sysdeps/unix/sysv/linux/lowlevellock.c: Likewise. * sysdeps/pthread/pthread_cond_signal.c: Don't use requeue.
Diffstat (limited to 'nptl/sysdeps/unix/sysv')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/lowlevellock.c22
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h25
3 files changed, 24 insertions, 43 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
index 47174700d0..b30659fe90 100644
--- a/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
@@ -127,10 +127,8 @@ static inline void
__attribute__ ((always_inline))
__lll_mutex_lock (int *futex)
{
- int val = atomic_exchange_and_add (futex, 1);
-
- if (__builtin_expect (val != 0, 0))
- __lll_lock_wait (futex, val);
+ if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0)
+ __lll_lock_wait (futex);
}
#define lll_mutex_lock(futex) __lll_mutex_lock (&(futex))
@@ -139,13 +137,8 @@ static inline void
__attribute__ ((always_inline))
__lll_mutex_cond_lock (int *futex)
{
- int val = atomic_exchange_and_add (futex, 2);
-
- if (__builtin_expect (val != 0, 0))
- /* Note, the val + 1 is kind of ugly here. __lll_lock_wait will add
- 1 again. But we added 2 to the futex value so this is the right
- value which will be passed to the kernel. */
- __lll_lock_wait (futex, val + 1);
+ if (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0)
+ __lll_lock_wait (futex);
}
#define lll_mutex_cond_lock(futex) __lll_mutex_cond_lock (&(futex))
@@ -158,11 +151,10 @@ static inline int
__attribute__ ((always_inline))
__lll_mutex_timedlock (int *futex, const struct timespec *abstime)
{
- int val = atomic_exchange_and_add (futex, 1);
int result = 0;
- if (__builtin_expect (val != 0, 0))
- result = __lll_timedlock_wait (futex, val, abstime);
+ if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0)
+ result = __lll_timedlock_wait (futex, abstime);
return result;
}
diff --git a/nptl/sysdeps/unix/sysv/linux/lowlevellock.c b/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
index b92df1b401..5021cdf4ba 100644
--- a/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
+++ b/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
@@ -25,22 +25,20 @@
void
-__lll_lock_wait (int *futex, int val)
+__lll_lock_wait (int *futex)
{
- /* In the loop we are going to add 2 instead of 1 which is what
- the caller did. Account for that. */
- --val;
do
{
- lll_futex_wait (futex, val + 2);
- val = atomic_exchange_and_add (futex, 2);
+ int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
+ if (oldval != 0)
+ lll_futex_wait (futex, 2);
}
- while (val != 0);
+ while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
}
int
-__lll_timedlock_wait (int *futex, int val, const struct timespec *abstime)
+__lll_timedlock_wait (int *futex, const struct timespec *abstime)
{
/* Reject invalid timeouts. */
if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
@@ -68,12 +66,12 @@ __lll_timedlock_wait (int *futex, int val, const struct timespec *abstime)
return ETIMEDOUT;
/* Wait. */
- if (lll_futex_timed_wait (futex, val + 1, &rt) == -ETIMEDOUT)
- return ETIMEDOUT;
+ int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
+ if (oldval != 0)
+ lll_futex_wait (futex, 2);
}
- while ((val = atomic_exchange_and_add (futex, 1)) != 0);
+ while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
- *futex = 2;
return 0;
}
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
index a987accbed..0caee0cd1f 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
@@ -106,34 +106,25 @@ extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
#define lll_mutex_lock(lock) \
(void) ({ \
int *__futex = &(lock); \
- int __val = atomic_exchange_and_add (__futex, 1); \
- __asm __volatile (__lll_acq_instr ::: "memory"); \
- if (__builtin_expect (__val != 0, 0)) \
- __lll_lock_wait (__futex, __val); \
+ if (atomic_compare_and_exchange_bool_acq (__futex, 1, 0) != 0) \
+ __lll_lock_wait (__futex); \
})
#define lll_mutex_cond_lock(lock) \
(void) ({ \
int *__futex = &(lock); \
- int __val = atomic_exchange_and_add (__futex, 2); \
- __asm __volatile (__lll_acq_instr ::: "memory"); \
- if (__builtin_expect (__val != 0, 0)) \
- /* Note, the val + 1 is kind of ugly here. __lll_lock_wait will add \
- 1 again. But we added 2 to the futex value so this is the right \
- value which will be passed to the kernel. */ \
- __lll_lock_wait (__futex, __val + 1); \
+ if (atomic_compare_and_exchange_bool_acq (__futex, 2, 0) != 0) \
+ __lll_lock_wait (__futex); \
})
extern int __lll_timedlock_wait
(int *futex, int val, const struct timespec *) attribute_hidden;
#define lll_mutex_timedlock(lock, abstime) \
- ({ int *__futex = &(lock); \
- int __val = atomic_exchange_and_add (__futex, 1); \
- __asm __volatile (__lll_acq_instr ::: "memory"); \
- if (__builtin_expect (__val != 0, 0)) \
- __val = __lll_timedlock_wait (__futex, __val, (abstime)); \
- __val; \
+ (void) ({ \
+ int *__futex = &(lock); \
+ if (atomic_compare_and_exchange_bool_acq (__futex, 1, 0) != 0) \
+ __lll_timedlock_wait (__futex, abstime); \
})
#define lll_mutex_unlock(lock) \