diff options
-rw-r--r-- | nptl/ChangeLog | 9 | ||||
-rw-r--r-- | nptl/cancellation.c | 7 | ||||
-rw-r--r-- | nptl/libc-cancellation.c | 7 | ||||
-rw-r--r-- | nptl/sysdeps/i386/tls.h | 17 | ||||
-rw-r--r-- | nptl/sysdeps/x86_64/tls.h | 13 |
5 files changed, 49 insertions, 4 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 838a010034..54aa54637a 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,12 @@ +2009-04-27 Ulrich Drepper <drepper@redhat.com> + + * cancellation.c (__pthread_disable_asynccancel): Use THREAD_ATOMIC_AND + is available. + * libc-cancellation.c (__libc_disable_asynccancel): Likewise. + * sysdeps/x86_64/tls.h: Define THREAD_ATOMIC_AND. + * sysdeps/i386/tls.h: Likewise. + (tcbhead_t): Add __private_tm member. + 2009-04-26 Ulrich Drepper <drepper@redhat.com> * sem_open.c (sem_open): Rewrite initialization of initsem to diff --git a/nptl/cancellation.c b/nptl/cancellation.c index 1d28d383f9..81134a679a 100644 --- a/nptl/cancellation.c +++ b/nptl/cancellation.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -70,6 +70,10 @@ __pthread_disable_asynccancel (int oldtype) return; struct pthread *self = THREAD_SELF; + +#ifdef THREAD_ATOMIC_AND + THREAD_ATOMIC_AND (self, cancelhandling, ~CANCELTYPE_BITMASK); +#else int oldval = THREAD_GETMEM (self, cancelhandling); while (1) @@ -87,4 +91,5 @@ __pthread_disable_asynccancel (int oldtype) /* Prepare the next round. */ oldval = curval; } +#endif } diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c index b88a32fefd..cf24f1c0f2 100644 --- a/nptl/libc-cancellation.c +++ b/nptl/libc-cancellation.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -86,6 +86,10 @@ __libc_disable_asynccancel (int oldtype) return; struct pthread *self = THREAD_SELF; + +#ifdef THREAD_ATOMIC_AND + THREAD_ATOMIC_AND (self, cancelhandling, ~CANCELTYPE_BITMASK); +#else int oldval = THREAD_GETMEM (self, cancelhandling); while (1) @@ -103,6 +107,7 @@ __libc_disable_asynccancel (int oldtype) /* Prepare the next round. */ oldval = curval; } +#endif } diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h index b5127420cf..f23977e73f 100644 --- a/nptl/sysdeps/i386/tls.h +++ b/nptl/sysdeps/i386/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. nptl/i386 version. - Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. + Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -56,7 +56,11 @@ typedef struct int gscope_flag; #ifndef __ASSUME_PRIVATE_FUTEX int private_futex; +#else + int __unused1; #endif + /* Reservation of some values for the TM ABI. */ + void *__private_tm[5]; } tcbhead_t; # define TLS_MULTIPLE_THREADS_IN_TCB 1 @@ -394,6 +398,17 @@ union user_desc_init __ret; }) +/* Atomic logical and. */ +#define THREAD_ATOMIC_AND(descr, member, val) \ + (void) ({ if (sizeof ((descr)->member) == 4) \ + asm volatile (LOCK_PREFIX "andl %1, %%gs:%P0" \ + :: "i" (offsetof (struct pthread, member)), \ + "ir" (val)); \ + else \ + /* Not necessary for other sizes in the moment. */ \ + abort (); }) + + /* Atomic set bit. */ #define THREAD_ATOMIC_BIT_SET(descr, member, bit) \ (void) ({ if (sizeof ((descr)->member) == 4) \ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index 172f44579b..ea89f3b1a2 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. nptl/x86_64 version. - Copyright (C) 2002-2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002-2007, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -312,6 +312,17 @@ typedef struct __ret; }) +/* Atomic logical and. */ +#define THREAD_ATOMIC_AND(descr, member, val) \ + (void) ({ if (sizeof ((descr)->member) == 4) \ + asm volatile (LOCK_PREFIX "andl %1, %%fs:%P0" \ + :: "i" (offsetof (struct pthread, member)), \ + "ir" (val)); \ + else \ + /* Not necessary for other sizes in the moment. */ \ + abort (); }) + + /* Atomic set bit. */ #define THREAD_ATOMIC_BIT_SET(descr, member, bit) \ (void) ({ if (sizeof ((descr)->member) == 4) \ |