]> sourceware.org Git - glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 21 Nov 2003 10:00:11 +0000 (10:00 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 21 Nov 2003 10:00:11 +0000 (10:00 +0000)
* sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Don't
store mutex address if the current value is ~0l.
* sysdeps/pthread/pthread_cond_timedwait.c
(__pthread_cond_timedwait): Likewise.
* sysdeps/pthread/pthread_cond_broadcast.c
(__pthread_cond_broadcast): Don't use requeue for pshared
condvars.

* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
(__pthread_cond_wait): Don't store mutex address if the current
value is ~0l.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Likewise.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
(__pthread_cond_broadcast): Don't use requeue for pshared
condvars.

* pthread_cond_init.c (__pthread_cond_init): Initialize __mutex
element with ~0l for pshared condvars, with NULL otherwise.

* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
(__pthread_cond_wait): Don't store mutex address if the current
value is ~0l.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Likewise.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
(__pthread_cond_broadcast): Don't use requeue for pshared
condvars.

nptl/ChangeLog
nptl/pthread_cond_init.c
nptl/sysdeps/pthread/pthread_cond_broadcast.c
nptl/sysdeps/pthread/pthread_cond_timedwait.c
nptl/sysdeps/pthread/pthread_cond_wait.c
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S

index 80497111f7cb1b2e5f8f819883d68ae808c9a6ba..5c9dfa828225b38fb8819e301cedb4661f7386a9 100644 (file)
@@ -1,5 +1,34 @@
 2003-11-21  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Don't
+       store mutex address if the current value is ~0l.
+       * sysdeps/pthread/pthread_cond_timedwait.c
+       (__pthread_cond_timedwait): Likewise.
+       * sysdeps/pthread/pthread_cond_broadcast.c
+       (__pthread_cond_broadcast): Don't use requeue for pshared
+       condvars.
+
+       * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+       (__pthread_cond_wait): Don't store mutex address if the current
+       value is ~0l.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+       (__pthread_cond_timedwait): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
+       (__pthread_cond_broadcast): Don't use requeue for pshared
+       condvars.
+
+       * pthread_cond_init.c (__pthread_cond_init): Initialize __mutex
+       element with ~0l for pshared condvars, with NULL otherwise.
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+       (__pthread_cond_wait): Don't store mutex address if the current
+       value is ~0l.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+       (__pthread_cond_timedwait): Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
+       (__pthread_cond_broadcast): Don't use requeue for pshared
+       condvars.
+
        * Makefile: Add rules to build and run tst-cond12 and tst-cond13.
        * tst-cond12.c: New file.
        * tst-cond13.c: New file.
index 73ae4321b0f18a9296c7b30b96c6502dde892ab4..bb7c6d6ca1d85c69484c3e7be742d92ea828350c 100644 (file)
@@ -36,6 +36,8 @@ __pthread_cond_init (cond, cond_attr)
   cond->__data.__total_seq = 0;
   cond->__data.__wakeup_seq = 0;
   cond->__data.__woken_seq = 0;
+  cond->__data.__mutex = (icond_attr == NULL || (icond_attr->value & 1) == 0
+                         ? NULL : (void *) ~0l);
 
   return 0;
 }
index 6c3722a9cd9f177cd5607b37809db7e2a497bb89..44c3fe6d5fb3697435075a7d549160a11ddcba1e 100644 (file)
@@ -54,6 +54,10 @@ __pthread_cond_broadcast (cond)
 # error "No valid byte order"
 #endif
 
+      /* Do not use requeue for pshared condvars.  */
+      if (cond->__data.__mutex == (void *) ~0l)
+       goto wake_all;
+
       /* Wake everybody.  */
       pthread_mutex_t *mut = (pthread_mutex_t *) cond->__data.__mutex;
       if (__builtin_expect (lll_futex_requeue (futex, 1, INT_MAX,
@@ -61,9 +65,8 @@ __pthread_cond_broadcast (cond)
                            0))
        {
          /* The requeue functionality is not available.  */
-#ifndef __ASSUME_FUTEX_REQUEUE
+       wake_all:
          lll_futex_wake (futex, INT_MAX);
-#endif
        }
 
       /* That's all.  */
index 1655c70c2ac377be1e95b7cf524caf5d3bc2e4e3..9fa2920f85de6be2a4416aabcfd54ba92fa0a2ac 100644 (file)
@@ -67,8 +67,10 @@ __pthread_cond_timedwait (cond, mutex, abstime)
   ++cond->__data.__total_seq;
 
   /* Remember the mutex we are using here.  If there is already a
-     different address store this is a bad user bug.  */
-  cond->__data.__mutex = mutex;
+     different address store this is a bad user bug.  Do not store
+     anything for pshared condvars.  */
+  if (cond->__data.__mutex != (void *) ~0l)
+    cond->__data.__mutex = mutex;
 
   /* Prepare structure passed to cancellation handler.  */
   cbuffer.cond = cond;
index 75edf3d15844152bc16dde3cce18d8a465a7edee..79c6d9951c1b5bbb9e984dedf5c28431c78f299b 100644 (file)
@@ -93,8 +93,10 @@ __pthread_cond_wait (cond, mutex)
   ++cond->__data.__total_seq;
 
   /* Remember the mutex we are using here.  If there is already a
-     different address store this is a bad user bug.  */
-  cond->__data.__mutex = mutex;
+     different address store this is a bad user bug.  Do not store
+     anything for pshared condvars.  */
+  if (cond->__data.__mutex != (void *) ~0l)
+    cond->__data.__mutex = mutex;
 
   /* Prepare structure passed to cancellation handler.  */
   cbuffer.cond = cond;
index cdcf6d29145fc93457c36bdd1d7eb5cb7316ff2f..8d09e22afdd564defe24e9b853000927d85acbbd 100644 (file)
@@ -83,8 +83,12 @@ __pthread_cond_broadcast:
        subl    $1, cond_lock-wakeup_seq(%ebx)
        jne     7f
 
+       /* Don't use requeue for pshared condvars.  */
+8:     cmpl    $-1, %edi
+       je      9f
+
        /* Wake up all threads.  */
-8:     movl    $FUTEX_REQUEUE, %ecx
+       movl    $FUTEX_REQUEUE, %ecx
        movl    $SYS_futex, %eax
        movl    $0x7fffffff, %esi
        movl    $1, %edx
@@ -97,10 +101,9 @@ __pthread_cond_broadcast:
 #ifndef __ASSUME_FUTEX_REQUEUE
        cmpl    $-EINVAL, %eax
        je      9f
-10:
 #endif
 
-       xorl    %eax, %eax
+10:    xorl    %eax, %eax
        popl    %edi
        popl    %esi
        popl    %ebx
@@ -138,14 +141,12 @@ __pthread_cond_broadcast:
        call    __lll_mutex_unlock_wake
        jmp     8b
 
-#ifndef __ASSUME_FUTEX_REQUEUE
 9:     /* The futex requeue functionality is not available.  */
        movl    $0x7fffffff, %edx
        movl    $FUTEX_WAKE, %ecx
        movl    $SYS_futex, %eax
        ENTER_KERNEL
        jmp     10b
-#endif
        .size   __pthread_cond_broadcast, .-__pthread_cond_broadcast
 versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
                  GLIBC_2_3_2)
index ca5c1423c09331377ed92ef3f02930c20e372583..06ad11c11b7d6f4df8ada5915dcb560a3c60cf17 100644 (file)
@@ -68,11 +68,13 @@ __pthread_cond_timedwait:
 
        /* Store the reference to the mutex.  If there is already a
           different value in there this is a bad user bug.  */
-2:     movl    24(%esp), %eax
+2:     cmpl    $-1, dep_mutex(%ebx)
+       movl    24(%esp), %eax
+       je      17f
        movl    %eax, dep_mutex(%ebx)
 
        /* Unlock the mutex.  */
-       xorl    %edx, %edx
+17:    xorl    %edx, %edx
        call    __pthread_mutex_unlock_usercnt
 
        testl   %eax, %eax
index ff3a1ccef3809cb8115cb8f94b4ad0ae26a727c2..b38fd6bf3b4cccd4338c9836091cf7904ee0e83a 100644 (file)
@@ -65,11 +65,13 @@ __pthread_cond_wait:
 
        /* Store the reference to the mutex.  If there is already a
           different value in there this is a bad user bug.  */
-2:     movl    20(%esp), %eax
+2:     cmpl    $-1, dep_mutex(%ebx)
+       movl    20(%esp), %eax
+       je      15f
        movl    %eax, dep_mutex(%ebx)
 
        /* Unlock the mutex.  */
-       xorl    %edx, %edx
+15:    xorl    %edx, %edx
        call    __pthread_mutex_unlock_usercnt
 
        testl   %eax, %eax
index e6b2bbf19c5c27b72b6be90062a6a4b0af8789d2..8e26681b3b7954c400a22ef168170836b3e94908 100644 (file)
@@ -72,8 +72,11 @@ __pthread_cond_broadcast:
        decl    cond_lock-wakeup_seq(%rdi)
        jne     7f
 
+8:     cmpq    $-1, %r8
+       je      9f
+
        /* Wake up all threads.  */
-8:     movq    $FUTEX_REQUEUE, %rsi
+       movq    $FUTEX_REQUEUE, %rsi
        movq    $SYS_futex, %rax
        movl    $1, %edx
        movq    $0x7fffffff, %r10
@@ -82,10 +85,9 @@ __pthread_cond_broadcast:
 #ifndef __ASSUME_FUTEX_REQUEUE
        cmpq    $-EINVAL, %rax
        je      9f
-10:
 #endif
 
-       xorl    %eax, %eax
+10:    xorl    %eax, %eax
        retq
 
        .align  16
@@ -119,14 +121,12 @@ __pthread_cond_broadcast:
        subq    $cond_lock-wakeup_seq, %rdi
        jmp     8b
 
-#ifndef __ASSUME_FUTEX_REQUEUE
 9:     /* The futex requeue functionality is not available.  */
        movq    $0x7fffffff, %rdx
        movq    $FUTEX_WAKE, %rsi
        movq    $SYS_futex, %rax
        syscall
        jmp     10b
-#endif
        .size   __pthread_cond_broadcast, .-__pthread_cond_broadcast
 versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
                  GLIBC_2_3_2)
index c0c8f55cfb98b9fd1e9a8099314489efeb479fad..e001441490f82f7b4b8023e51540642f18c8ba9c 100644 (file)
@@ -71,15 +71,18 @@ __pthread_cond_timedwait:
                    +--------------------------+
        */
 
+       cmpq    $-1, dep_mutex(%rdi)
+
        /* Prepare structure passed to cancellation handler.  */
        movq    %rdi, 8(%rsp)
        movq    %rsi, 16(%rsp)
        movq    %rdx, %r13
 
+       je      22f
        movq    %rsi, dep_mutex(%rdi)
 
        /* Get internal lock.  */
-       movl    $1, %esi
+22:    movl    $1, %esi
        xorl    %eax, %eax
        LOCK
 #if cond_lock == 0
index d8681ebe6b36a496b853dadfb2d343856319b681..e572874d7a1bb85ee5ceef684f6070675ef7f41a 100644 (file)
@@ -117,14 +117,17 @@ __pthread_cond_wait:
                    +--------------------------+
        */
 
-       /* Prepare structure passed to cancellation handler.  */
+       cmpq    $-1, dep_mutex(%rdi)
+
+               /* Prepare structure passed to cancellation handler.  */
        movq    %rdi, 8(%rsp)
        movq    %rsi, 16(%rsp)
 
+       je      15f
        movq    %rsi, dep_mutex(%rdi)
 
        /* Get internal lock.  */
-       movl    $1, %esi
+15:    movl    $1, %esi
        xorl    %eax, %eax
        LOCK
 #if cond_lock == 0
This page took 0.06183 seconds and 5 git commands to generate.