(FUTEX_WAKE_OP, FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. (lll_futex_wake_unlock):...
authorUlrich Drepper <drepper@redhat.com>
Thu, 8 Sep 2005 17:39:07 +0000 (17:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 8 Sep 2005 17:39:07 +0000 (17:39 +0000)
nptl/sysdeps/unix/sysv/linux/alpha/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h

index fd4a7ca..ab325d2 100644 (file)
@@ -31,6 +31,8 @@
 #define FUTEX_WAKE             1
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
+#define FUTEX_WAKE_OP          5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE  ((4 << 24) | 1)
 
 /* Initializer for compatibility lock. */
 #define LLL_MUTEX_LOCK_INITIALIZER (0)
     INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
   })
 
+/* Returns non-zero if error happened, zero if success.  */
+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \
+  ({                                                                         \
+    INTERNAL_SYSCALL_DECL (__err);                                           \
+    long int __ret;                                                          \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6,                               \
+                             (futexp), FUTEX_WAKE_OP, (nr_wake),             \
+                             (nr_wake2), (futexp2),                          \
+                             FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);                 \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
+  })
+
+
+
 
 static inline int __attribute__((always_inline))
 __lll_mutex_trylock(int *futex)
index e13358f..4219fe2 100644 (file)
@@ -31,6 +31,8 @@
 #define FUTEX_WAKE             1
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
+#define FUTEX_WAKE_OP          5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE  ((4 << 24) | 1)
 
 /* Delay in spinlock loop.  */
 #define BUSY_WAIT_NOP          asm ("hint @pause")
    _r10 == -1;                                                              \
 })
 
+/* Returns non-zero if error happened, zero if success.  */
+#define lll_futex_wake_unlock(ftx, nr_wake, nr_wake2, ftx2)                 \
+({                                                                          \
+   DO_INLINE_SYSCALL(futex, 6, (long) (ftx), FUTEX_WAKE_OP,                 \
+                    (int) (nr_wake), (int) (nr_wake2), (long) (ftx2),       \
+                    FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);                         \
+   _r10 == -1;                                                              \
+})
+
 
 #define __lll_mutex_trylock(futex) \
   (atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0)
index 1f2f481..f9eaa11 100644 (file)
@@ -33,6 +33,8 @@
 #define FUTEX_WAKE             1
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
+#define FUTEX_WAKE_OP          5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE  ((4 << 24) | 1)
 
 /* Initializer for compatibility lock. */
 #define LLL_MUTEX_LOCK_INITIALIZER (0)
     INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
   })
 
+/* Returns non-zero if error happened, zero if success.  */
+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \
+  ({                                                                         \
+    INTERNAL_SYSCALL_DECL (__err);                                           \
+    long int __ret;                                                          \
+                                                                             \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6,                               \
+                             (futexp), FUTEX_WAKE_OP, (nr_wake),             \
+                             (nr_wake2), (futexp2),                          \
+                             FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);                 \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
+  })
+
 #ifdef UP
 # define __lll_acq_instr       ""
 # define __lll_rel_instr       ""
index f4ed98a..5f20537 100644 (file)
@@ -30,6 +30,8 @@
 #define FUTEX_WAKE             1
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
+#define FUTEX_WAKE_OP          5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE  ((4 << 24) | 1)
 
 /* Initializer for compatibility lock. */
 #define LLL_MUTEX_LOCK_INITIALIZER (0)
   })
 
 
+/* Returns non-zero if error happened, zero if success.  */
+#define lll_futex_wake_unlock(futex, nr_wake, nr_wake2, futex2) \
+  ({                                                                         \
+    register unsigned long int __r2 asm ("2") = (unsigned long int) (futex);  \
+    register unsigned long int __r3 asm ("3") = FUTEX_WAKE_OP;       \
+    register unsigned long int __r4 asm ("4") = (long int) (nr_wake);        \
+    register unsigned long int __r5 asm ("5") = (long int) (nr_wake2);       \
+    register unsigned long int __r6 asm ("6") = (unsigned long int) (futex2); \
+    register unsigned long int __r7 asm ("7")                                \
+      = (int) FUTEX_OP_CLEAR_WAKE_IF_GT_ONE;                                 \
+    register unsigned long __result asm ("2");                               \
+                                                                             \
+    __asm __volatile ("svc %b1"                                                      \
+                     : "=d" (__result)                                       \
+                     : "i" (SYS_futex), "0" (__r2), "d" (__r3),              \
+                       "d" (__r4), "d" (__r5), "d" (__r6), "d" (__r7)        \
+                     : "cc", "memory" );                                     \
+    __result > -4096UL;                                                              \
+  })
+
+
 #define lll_compare_and_swap(futex, oldval, newval, operation) \
   do {                                                                       \
     __typeof (futex) __futex = (futex);                                              \
index 4626aec..8d12db3 100644 (file)
@@ -30,6 +30,8 @@
 #define FUTEX_WAKE             1
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
+#define FUTEX_WAKE_OP          5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE  ((4 << 24) | 1)
 
 /* Initializer for compatibility lock. */
 #define LLL_MUTEX_LOCK_INITIALIZER (0)
     INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
   })
 
+/* Returns non-zero if error happened, zero if success.  */
+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \
+  ({                                                                         \
+    INTERNAL_SYSCALL_DECL (__err);                                           \
+    long int __ret;                                                          \
+                                                                             \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6,                               \
+                             (futexp), FUTEX_WAKE_OP, (nr_wake),             \
+                             (nr_wake2), (futexp2),                          \
+                             FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);                 \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);                                 \
+  })
+
 #ifdef __sparc32_atomic_do_lock
 #error SPARC < v9 does not support compare and swap which is essential for futex based locking
 #endif