mirror of git://sourceware.org/git/glibc.git
* 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.
This commit is contained in:
parent
6284c9f61e
commit
d5c157a978
|
@ -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>
|
2009-04-26 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sem_open.c (sem_open): Rewrite initialization of initsem to
|
* sem_open.c (sem_open): Rewrite initialization of initsem to
|
||||||
|
|
|
@ -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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -70,6 +70,10 @@ __pthread_disable_asynccancel (int oldtype)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct pthread *self = THREAD_SELF;
|
struct pthread *self = THREAD_SELF;
|
||||||
|
|
||||||
|
#ifdef THREAD_ATOMIC_AND
|
||||||
|
THREAD_ATOMIC_AND (self, cancelhandling, ~CANCELTYPE_BITMASK);
|
||||||
|
#else
|
||||||
int oldval = THREAD_GETMEM (self, cancelhandling);
|
int oldval = THREAD_GETMEM (self, cancelhandling);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
|
@ -87,4 +91,5 @@ __pthread_disable_asynccancel (int oldtype)
|
||||||
/* Prepare the next round. */
|
/* Prepare the next round. */
|
||||||
oldval = curval;
|
oldval = curval;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -86,6 +86,10 @@ __libc_disable_asynccancel (int oldtype)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct pthread *self = THREAD_SELF;
|
struct pthread *self = THREAD_SELF;
|
||||||
|
|
||||||
|
#ifdef THREAD_ATOMIC_AND
|
||||||
|
THREAD_ATOMIC_AND (self, cancelhandling, ~CANCELTYPE_BITMASK);
|
||||||
|
#else
|
||||||
int oldval = THREAD_GETMEM (self, cancelhandling);
|
int oldval = THREAD_GETMEM (self, cancelhandling);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
|
@ -103,6 +107,7 @@ __libc_disable_asynccancel (int oldtype)
|
||||||
/* Prepare the next round. */
|
/* Prepare the next round. */
|
||||||
oldval = curval;
|
oldval = curval;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definition for thread-local data handling. nptl/i386 version.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -56,7 +56,11 @@ typedef struct
|
||||||
int gscope_flag;
|
int gscope_flag;
|
||||||
#ifndef __ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
int private_futex;
|
int private_futex;
|
||||||
|
#else
|
||||||
|
int __unused1;
|
||||||
#endif
|
#endif
|
||||||
|
/* Reservation of some values for the TM ABI. */
|
||||||
|
void *__private_tm[5];
|
||||||
} tcbhead_t;
|
} tcbhead_t;
|
||||||
|
|
||||||
# define TLS_MULTIPLE_THREADS_IN_TCB 1
|
# define TLS_MULTIPLE_THREADS_IN_TCB 1
|
||||||
|
@ -394,6 +398,17 @@ union user_desc_init
|
||||||
__ret; })
|
__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. */
|
/* Atomic set bit. */
|
||||||
#define THREAD_ATOMIC_BIT_SET(descr, member, bit) \
|
#define THREAD_ATOMIC_BIT_SET(descr, member, bit) \
|
||||||
(void) ({ if (sizeof ((descr)->member) == 4) \
|
(void) ({ if (sizeof ((descr)->member) == 4) \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definition for thread-local data handling. nptl/x86_64 version.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -312,6 +312,17 @@ typedef struct
|
||||||
__ret; })
|
__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. */
|
/* Atomic set bit. */
|
||||||
#define THREAD_ATOMIC_BIT_SET(descr, member, bit) \
|
#define THREAD_ATOMIC_BIT_SET(descr, member, bit) \
|
||||||
(void) ({ if (sizeof ((descr)->member) == 4) \
|
(void) ({ if (sizeof ((descr)->member) == 4) \
|
||||||
|
|
Loading…
Reference in New Issue