Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 30 May 2003 04:53:50 +0000 (04:53 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 30 May 2003 04:53:50 +0000 (04:53 +0000)
* sysdeps/unix/sysv/linux/s390/lowlevellock.h
(__lll_mutex_unlock_force): New function
(lll_mutex_unlock_force): Use __lll_mutex_unlock_force.

nptl/Banner
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h

index 415c8db..32b4eee 100644 (file)
@@ -1 +1 @@
-NPTL 0.41 by Ulrich Drepper
+NPTL 0.42 by Ulrich Drepper
index 5d22f7f..5b7d306 100644 (file)
@@ -1,5 +1,9 @@
 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.
index 9569ba5..588f2a2 100644 (file)
@@ -93,6 +93,7 @@ typedef union
     unsigned long long int __total_seq;
     unsigned long long int __wakeup_seq;
     unsigned long long int __woken_seq;
+    void *__mutex;
   } __data;
   char __size[__SIZEOF_PTHREAD_COND_T];
   long long int __align;
index 621fdce..877483b 100644 (file)
@@ -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)
     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)
 
index 62a06b5..4d95319 100644 (file)
@@ -170,7 +170,7 @@ __attribute__ ((always_inline))
 __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)
@@ -179,8 +179,16 @@ __lll_mutex_unlock (int *futex)
 #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)