diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h index 621fdcee88..877483b22c 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h @@ -29,6 +29,7 @@ #define __NR_futex 221 #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 +#define FUTEX_REQUEUE 3 /* Initializer for compatibility lock. */ #define LLL_MUTEX_LOCK_INITIALIZER (0) @@ -63,6 +64,17 @@ INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret: 0; \ }) +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + \ + __ret = INTERNAL_SYSCALL (futex, __err, 5, \ + (futexp), FUTEX_REQUEUE, (nr_wake), (nr_move), \ + (mutex)); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret: 0; \ + }) + #ifdef UP # define __lll_acq_instr "" # define __lll_rel_instr "" @@ -100,6 +112,15 @@ extern void __lll_lock_wait (int *futex, int val) attribute_hidden; __lll_lock_wait (__futex, __val); \ }) +#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)) \ + __lll_lock_wait (__futex, __val); \ + }) + extern int __lll_timedlock_wait (int *futex, int val, const struct timespec *) attribute_hidden; @@ -120,6 +141,13 @@ extern int __lll_timedlock_wait lll_futex_wake (__futex, 1); \ })) +#define lll_mutex_unlock_force(lock) \ + ((void) ({ \ + int *__futex = &(lock); \ + *__futex = 0; \ + lll_futex_wake (__futex, 1); \ + })) + #define lll_mutex_islocked(futex) \ (futex != 0) |