]> sourceware.org Git - glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 11 Mar 2003 23:26:35 +0000 (23:26 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 11 Mar 2003 23:26:35 +0000 (23:26 +0000)
* cancellation.c (__pthread_enable_asynccancel_2): New function.
* pthreadP.h: Declare __pthread_enable_asynccancel_2.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Use __pthread_enable_asynccancel_2
instead of __pthread_enable_asynccancel.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
(__pthread_cond_wait): Likewise.
* sysdeps/pthread/pthread_cond_timedwait.c
(__pthread_cond_timedwait): Likewise.
* sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise.

nptl/Banner
nptl/ChangeLog
nptl/cancellation.c
nptl/pthreadP.h
nptl/sysdeps/pthread/pthread_cond_timedwait.c
nptl/sysdeps/pthread/pthread_cond_wait.c
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/lowlevellock.S
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S

index 6e4ad3f7893ac08e496908afc909335cf88d8ae2..7b44e76bdc2c0f4a3886513bfd7cc42c88672a50 100644 (file)
@@ -1 +1 @@
-NPTL 0.28 by Ulrich Drepper
+NPTL 0.29 by Ulrich Drepper
index a4cd4f54825da4b1be28fee16fd11bc7dd9227c2..15b9cd71adb7b11cfa1be0ad64a91dc289711f72 100644 (file)
@@ -1,5 +1,16 @@
 2003-03-11  Ulrich Drepper  <drepper@redhat.com>
 
+       * cancellation.c (__pthread_enable_asynccancel_2): New function.
+       * pthreadP.h: Declare __pthread_enable_asynccancel_2.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+       (__pthread_cond_timedwait): Use __pthread_enable_asynccancel_2
+       instead of __pthread_enable_asynccancel.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+       (__pthread_cond_wait): Likewise.
+       * sysdeps/pthread/pthread_cond_timedwait.c
+       (__pthread_cond_timedwait): Likewise.
+       * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise.
+
        * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
        (__condvar_cleanup): Wake up all waiters in case we got signaled
        after being woken up but before disabling asynchronous
index f136bbb4c49cc5ef94910bbb7c12d8c9fc0804fa..1dfbe4baca4a128ae347e61af5aafb92aff942b3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -57,6 +57,35 @@ __pthread_enable_asynccancel (void)
   return oldval;
 }
 
+/* XXX Ideally we have only one version.  But this needs preparation.  */
+void
+internal_function attribute_hidden
+__pthread_enable_asynccancel_2 (int *oldvalp)
+{
+  struct pthread *self = THREAD_SELF;
+
+  while (1)
+    {
+      int oldval = *oldvalp = THREAD_GETMEM (self, cancelhandling);
+      int newval = oldval | CANCELTYPE_BITMASK;
+
+      if (newval == oldval)
+       break;
+
+      if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
+                                          oldval) == 0)
+       {
+         if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
+           {
+             THREAD_SETMEM (self, result, PTHREAD_CANCELED);
+             __do_cancel ();
+           }
+
+         break;
+       }
+    }
+}
+
 
 void
 internal_function attribute_hidden
index c9f31e801a37c23de33610c14500752ff629cc5a..ca458974c85fd3f1d33a623796eccf12f9fc3cfa 100644 (file)
@@ -319,6 +319,8 @@ extern int __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond,
 
 /* The two functions are in libc.so and not exported.  */
 extern int __libc_enable_asynccancel (void) attribute_hidden;
+extern void __libc_enable_asynccancel_2 (int *oldvalp)
+     internal_function attribute_hidden;
 extern void __libc_disable_asynccancel (int oldtype)
      internal_function attribute_hidden;
 
index 417f873868b34fdf54f2d25c0331ca60dffef6b6..0635e6ed93b2f851919f8a25aba86c84e2292776 100644 (file)
@@ -120,7 +120,7 @@ __pthread_cond_timedwait (cond, mutex, abstime)
       lll_mutex_unlock (cond->__data.__lock);
 
       /* Enable asynchronous cancellation.  Required by the standard.  */
-      cbuffer.oldtype = __pthread_enable_asynccancel ();
+      __pthread_enable_asynccancel_2 (&cbuffer.oldtype);
 
       /* Wait until woken by signal or broadcast.  Note that we
         truncate the 'val' value to 32 bits.  */
index 78fcc7f6c61bc6c85e7350aa03fc1a94b708c48a..b681ef26fd8de51a10c91419cad4db0ac8265db8 100644 (file)
@@ -123,7 +123,7 @@ __pthread_cond_wait (cond, mutex)
       lll_mutex_unlock (cond->__data.__lock);
 
       /* Enable asynchronous cancellation.  Required by the standard.  */
-      cbuffer.oldtype = __pthread_enable_asynccancel ();
+      __pthread_enable_asynccancel_2 (&cbuffer.oldtype);
 
       /* Wait until woken by signal or broadcast.  Note that we
         truncate the 'val' value to 32 bits.  */
@@ -133,7 +133,7 @@ __pthread_cond_wait (cond, mutex)
       __pthread_disable_asynccancel (cbuffer.oldtype);
 
       /* We are going to look at shared data again, so get the lock.  */
-      lll_mutex_lock(cond->__data.__lock);
+      lll_mutex_lock (cond->__data.__lock);
 
       /* Check whether we are eligible for wakeup.  */
       val = cond->__data.__wakeup_seq;
index 122be6f7145a8382435ac08c0f8f7ad90cafb6a2..f11a44ec431ecb2efd04eb480ac753382e8a5805 100644 (file)
@@ -108,8 +108,8 @@ __pthread_cond_timedwait:
 #endif
        jne     3f
 
-4:     call    __pthread_enable_asynccancel
-       movl    %eax, (%esp)
+4:     movl    %esp, %eax
+       call    __pthread_enable_asynccancel_2
 
        /* Get the current time.  */
        movl    %ebx, %edx
@@ -145,6 +145,7 @@ __pthread_cond_timedwait:
        subl    $wakeup_seq, %ebx
        movl    %eax, %esi
 
+       movl    (%esp), %eax
        call    __pthread_disable_asynccancel
 
        /* Lock.  */
index b3a49e794ad024da51067749b004017702059458..c13c38290e0328e70f34ce2368033af1824c4220 100644 (file)
@@ -165,8 +165,8 @@ __pthread_cond_wait:
 #endif
        jne     3f
 
-4:     call    __pthread_enable_asynccancel
-       movl    %eax, (%esp)
+4:     movl    %esp, %eax
+       call    __pthread_enable_asynccancel_2
 
        movl    %esi, %ecx      /* movl $FUTEX_WAIT, %ecx */
        movl    %edi, %edx
@@ -175,6 +175,7 @@ __pthread_cond_wait:
        ENTER_KERNEL
        subl    $wakeup_seq, %ebx
 
+       movl    (%esp), %eax
        call    __pthread_disable_asynccancel
 
        /* Lock.  */
index e7e1707a486f5657d349ea59d3b5314bf8963f42..1585921ff0e52d659fa0a5bd1b2b85bdabdd2eba 100644 (file)
@@ -49,7 +49,7 @@ __lll_lock_wait:
        xorq    %r10, %r10      /* No timeout.  */
 
 1:
-       leal    -1(%esi), %edx  /* account for the preceeded xadd.  */
+       leaq    -1(%rsi), %rdx  /* account for the preceeded xadd.  */
        movq    %r10, %rsi      /* movl $FUTEX_WAIT, %ecx */
        movq    $SYS_futex, %rax
        syscall
index a494e0efaa0beef1c90bc749c0944ad777f07d77..55e4ec468201f535d4ea9d467be395cedb9def00 100644 (file)
@@ -50,7 +50,7 @@ __lll_mutex_lock_wait:
        xorq    %r10, %r10      /* No timeout.  */
 
 1:
-       leal    1(%esi), %edx   /* account for the preceeded xadd.  */
+       leaq    1(%rsi), %rdx   /* account for the preceeded xadd.  */
        movq    %r10, %rsi      /* movl $FUTEX_WAIT, %ecx */
        movq    $SYS_futex, %rax
        syscall
index c15566fdf08c28fe05f803ca92ceff1350b9aea9..193cc081e1dfd7b3e1f4bd4dd50235aafdc9c00a 100644 (file)
@@ -153,9 +153,10 @@ __pthread_cond_wait:
 #endif
        jne     3f
 
-4:     callq   __pthread_enable_asynccancel
-       movq    %rax, (%rsp)
+4:     movq    %rsp, %edi
+       callq   __pthread_enable_asynccancel_2
 
+       movq    8(%rsp), %rdi
        xorq    %r10, %r10
        movq    %r12, %rdx
        addq    $wakeup_seq-cond_lock, %rdi
This page took 0.056507 seconds and 5 git commands to generate.