2003-05-29 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/unix/sysv/linux/s390/lowlevellock.h
+ (__lll_mutex_unlock_force): New function
+ (lll_mutex_unlock_force): Use __lll_mutex_unlock_force.
+
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h
(__lll_mutex_unlock_force): New function.
(lll_mutex_unlock_force): Use __lll_mutex_unlock_force.
#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)
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 ""
__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;
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)
__lll_mutex_unlock (int *futex)
{
int oldval;
- int newval;
+ int newval = 0;
lll_compare_and_swap (futex, oldval, newval, "slr %2,%2");
if (oldval > 1)
#define lll_mutex_unlock(futex) \
__lll_mutex_unlock(&(futex))
+
+static inline void
+__attribute__ ((always_inline))
+__lll_mutex_unlock_force (int *futex)
+{
+ *futex = 0;
+ lll_futex_wake (futex, 1);
+}
#define lll_mutex_unlock_force(futex) \
- lll_futex_wake (&(futex), 1)
+ __lll_mutex_unlock_force(&(futex))
#define lll_mutex_islocked(futex) \
(futex != 0)