1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

* sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Use explicit

insn suffix.
	(THREAD_GSCOPE_GET_FLAG): Remove.
	* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Remove.
	* allocatestack.c (__wait_lookup_done): Revert 2007-05-24
	changes.
	* sysdeps/powerpc/tls.h (tcbhead_t): Remove gscope_flag.
	(THREAD_GSCOPE_GET_FLAG): Remove.
	(THREAD_GSCOPE_RESET_FLAG): Use THREAD_SELF->header.gscope_flag
	instead of THREAD_GSCOPE_GET_FLAG.
	(THREAD_GSCOPE_SET_FLAG): Likewise.  Add atomic_write_barrier after
	it.
	* sysdeps/s390/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_WAIT): Define.
	* sysdeps/sparc/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_WAIT): Define.
	* sysdeps/sh/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_WAIT): Define.
	* sysdeps/ia64/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_WAIT): Define.

2007-05-24  Richard Henderson  <rth@redhat.com>

	* descr.h (struct pthread): Add header.gscope_flag.
	* sysdeps/alpha/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_WAIT): Define.
This commit is contained in:
Ulrich Drepper
2007-05-28 16:42:08 +00:00
parent cd0dbd8944
commit 991fa82be5
16 changed files with 207 additions and 56 deletions

View File

@ -1,3 +1,42 @@
2007-05-28 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Use explicit
insn suffix.
(THREAD_GSCOPE_GET_FLAG): Remove.
* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Remove.
* allocatestack.c (__wait_lookup_done): Revert 2007-05-24
changes.
* sysdeps/powerpc/tls.h (tcbhead_t): Remove gscope_flag.
(THREAD_GSCOPE_GET_FLAG): Remove.
(THREAD_GSCOPE_RESET_FLAG): Use THREAD_SELF->header.gscope_flag
instead of THREAD_GSCOPE_GET_FLAG.
(THREAD_GSCOPE_SET_FLAG): Likewise. Add atomic_write_barrier after
it.
* sysdeps/s390/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_WAIT): Define.
* sysdeps/sparc/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_WAIT): Define.
* sysdeps/sh/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_WAIT): Define.
* sysdeps/ia64/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_WAIT): Define.
2007-05-24 Richard Henderson <rth@redhat.com>
* descr.h (struct pthread): Add header.gscope_flag.
* sysdeps/alpha/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_WAIT): Define.
2007-05-27 Ulrich Drepper <drepper@redhat.com> 2007-05-27 Ulrich Drepper <drepper@redhat.com>
* init.c: Make it compile with older kernel headers. * init.c: Make it compile with older kernel headers.

View File

@ -1021,10 +1021,10 @@ __wait_lookup_done (void)
list_for_each (runp, &stack_used) list_for_each (runp, &stack_used)
{ {
struct pthread *t = list_entry (runp, struct pthread, list); struct pthread *t = list_entry (runp, struct pthread, list);
if (t == self || THREAD_GSCOPE_GET_FLAG (t) == THREAD_GSCOPE_FLAG_UNUSED) if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
continue; continue;
int *const gscope_flagp = &THREAD_GSCOPE_GET_FLAG (t); int *const gscope_flagp = &t->header.gscope_flag;
/* We have to wait until this thread is done with the global /* We have to wait until this thread is done with the global
scope. First tell the thread that we are waiting and scope. First tell the thread that we are waiting and
@ -1043,10 +1043,10 @@ __wait_lookup_done (void)
list_for_each (runp, &__stack_user) list_for_each (runp, &__stack_user)
{ {
struct pthread *t = list_entry (runp, struct pthread, list); struct pthread *t = list_entry (runp, struct pthread, list);
if (t == self || THREAD_GSCOPE_GET_FLAG (t) == THREAD_GSCOPE_FLAG_UNUSED) if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
continue; continue;
int *const gscope_flagp = &THREAD_GSCOPE_GET_FLAG (t); int *const gscope_flagp = &t->header.gscope_flag;
/* We have to wait until this thread is done with the global /* We have to wait until this thread is done with the global
scope. First tell the thread that we are waiting and scope. First tell the thread that we are waiting and

View File

@ -132,6 +132,7 @@ struct pthread
struct struct
{ {
int multiple_threads; int multiple_threads;
int gscope_flag;
# ifndef __ASSUME_PRIVATE_FUTEX # ifndef __ASSUME_PRIVATE_FUTEX
int private_futex; int private_futex;
# endif # endif

View File

@ -1,5 +1,5 @@
/* Definition for thread-local data handling. NPTL/Alpha version. /* Definition for thread-local data handling. NPTL/Alpha version.
Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2005, 2006, 2007 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
@ -121,6 +121,29 @@ typedef struct
#define THREAD_SETMEM_NC(descr, member, idx, value) \ #define THREAD_SETMEM_NC(descr, member, idx, value) \
descr->member[idx] = (value) descr->member[idx] = (value)
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -444,7 +444,7 @@ union user_desc_init
#define THREAD_GSCOPE_RESET_FLAG() \ #define THREAD_GSCOPE_RESET_FLAG() \
do \ do \
{ int __res; \ { int __res; \
asm volatile ("xchg %0, %%gs:%P1" \ asm volatile ("xchgl %0, %%gs:%P1" \
: "=r" (__res) \ : "=r" (__res) \
: "i" (offsetof (struct pthread, header.gscope_flag)), \ : "i" (offsetof (struct pthread, header.gscope_flag)), \
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \ "0" (THREAD_GSCOPE_FLAG_UNUSED)); \
@ -454,7 +454,6 @@ union user_desc_init
while (0) while (0)
#define THREAD_GSCOPE_SET_FLAG() \ #define THREAD_GSCOPE_SET_FLAG() \
THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED) THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED)
#define THREAD_GSCOPE_GET_FLAG(descr) (descr)->header.gscope_flag
#define THREAD_GSCOPE_WAIT() \ #define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) () GL(dl_wait_lookup_done) ()

View File

@ -1,5 +1,5 @@
/* Definition for thread-local data handling. nptl/IA-64 version. /* Definition for thread-local data handling. nptl/IA-64 version.
Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2004, 2005, 2006, 2007 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
@ -163,6 +163,29 @@ register struct pthread *__thread_self __asm__("r13");
(((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-2] \ (((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-2] \
= THREAD_GET_POINTER_GUARD ()) = THREAD_GET_POINTER_GUARD ())
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -63,11 +63,10 @@ typedef union dtv
# include <nptl/descr.h> # include <nptl/descr.h>
/* The stack_guard is accessed directly by GCC -fstack-protector code, /* The stack_guard is accessed directly by GCC -fstack-protector code,
so it is a part of public ABI. The dtv, pointer_guard and gscope_flag so it is a part of public ABI. The dtv and pointer_guard fields
fields are private. */ are private. */
typedef struct typedef struct
{ {
int gscope_flag;
uintptr_t pointer_guard; uintptr_t pointer_guard;
uintptr_t stack_guard; uintptr_t stack_guard;
dtv_t *dtv; dtv_t *dtv;
@ -181,24 +180,26 @@ register void *__thread_register __asm__ ("r13");
different value to mean unset l_tls_offset. */ different value to mean unset l_tls_offset. */
# define NO_TLS_OFFSET -1 # define NO_TLS_OFFSET -1
/* Get and set the global scope generation counter in the TCB head. */ /* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0 #define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1 #define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2 #define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_GET_FLAG(descr) \
(((tcbhead_t *) ((char *) (descr) \
+ TLS_PRE_TCB_SIZE))[-1].gscope_flag)
#define THREAD_GSCOPE_RESET_FLAG() \ #define THREAD_GSCOPE_RESET_FLAG() \
do \ do \
{ int __res \ { int __res \
= atomic_exchange_rel (&THREAD_GSCOPE_GET_FLAG (THREAD_SELF), \ = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \ THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \ if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_GSCOPE_GET_FLAG (THREAD_SELF), 1); \ lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \ } \
while (0) while (0)
#define THREAD_GSCOPE_SET_FLAG() \ #define THREAD_GSCOPE_SET_FLAG() \
(THREAD_GSCOPE_GET_FLAG (THREAD_SELF) = THREAD_GSCOPE_FLAG_USED) do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \ #define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) () GL(dl_wait_lookup_done) ()

View File

@ -1,5 +1,5 @@
/* Definition for thread-local data handling. NPTL/s390 version. /* Definition for thread-local data handling. NPTL/s390 version.
Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2004, 2005, 2006, 2007 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
@ -27,6 +27,7 @@
# include <stdint.h> # include <stdint.h>
# include <stdlib.h> # include <stdlib.h>
# include <list.h> # include <list.h>
# include <kernel-features.h>
/* Type for the dtv. */ /* Type for the dtv. */
@ -50,6 +51,10 @@ typedef struct
int multiple_threads; int multiple_threads;
uintptr_t sysinfo; uintptr_t sysinfo;
uintptr_t stack_guard; uintptr_t stack_guard;
int gscope_flag;
#ifndef __ASSUME_PRIVATE_FUTEX
int private_futex;
#endif
} tcbhead_t; } tcbhead_t;
# ifndef __s390x__ # ifndef __s390x__
@ -168,6 +173,29 @@ typedef struct
#define THREAD_SET_POINTER_GUARD(value) #define THREAD_SET_POINTER_GUARD(value)
#define THREAD_COPY_POINTER_GUARD(descr) #define THREAD_COPY_POINTER_GUARD(descr)
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -1,5 +1,5 @@
/* Definition for thread-local data handling. NPTL/SH version. /* Definition for thread-local data handling. NPTL/SH version.
Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2005, 2006, 2007 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
@ -150,6 +150,29 @@ typedef struct
__asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \
((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;}) ((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;})
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -1,5 +1,5 @@
/* Definitions for thread-local data handling. NPTL/sparc version. /* Definitions for thread-local data handling. NPTL/sparc version.
Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2005, 2006, 2007 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
@ -141,6 +141,29 @@ register struct pthread *__thread_self __asm__("%g7");
# define THREAD_COPY_POINTER_GUARD(descr) \ # define THREAD_COPY_POINTER_GUARD(descr) \
((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ()) ((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ())
/* Get and set the global scope generation counter in struct pthread. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#define THREAD_GSCOPE_FLAG_WAIT 2
#define THREAD_GSCOPE_RESET_FLAG() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
do \
{ \
THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
atomic_write_barrier (); \
} \
while (0)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* !ASSEMBLER */ #endif /* !ASSEMBLER */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -61,7 +61,7 @@ __pthread_rwlock_rdlock:
jne 14f jne 14f
cmpl $0, WRITERS_QUEUED(%ebx) cmpl $0, WRITERS_QUEUED(%ebx)
je 5f je 5f
cmpl $0, FLAGS(%ebx) cmpb $0, FLAGS(%ebx)
je 5f je 5f
3: addl $1, READERS_QUEUED(%ebx) 3: addl $1, READERS_QUEUED(%ebx)
@ -79,14 +79,12 @@ __pthread_rwlock_rdlock:
11: 11:
#if __ASSUME_PRIVATE_FUTEX #if __ASSUME_PRIVATE_FUTEX
movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx movzbl PSHARED(%ebx), %ecx
xorl PSHARED(%ebx), %ecx xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx
#else #else
# if FUTEX_WAIT == 0 movzbl PSHARED(%ebx), %ecx
movl PSHARED(%ebx), %ecx # if FUTEX_WAIT != 0
# else orl $FUTEX_WAIT, %ecx
movl $FUTEX_WAIT, %ecx
orl PSHARED(%ebx), %ecx
# endif # endif
xorl %gs:PRIVATE_FUTEX, %ecx xorl %gs:PRIVATE_FUTEX, %ecx
#endif #endif

View File

@ -65,7 +65,7 @@ pthread_rwlock_timedrdlock:
jne 14f jne 14f
cmpl $0, WRITERS_QUEUED(%ebp) cmpl $0, WRITERS_QUEUED(%ebp)
je 5f je 5f
cmpl $0, FLAGS(%ebp) cmpb $0, FLAGS(%ebp)
je 5f je 5f
/* Check the value of the timeout parameter. */ /* Check the value of the timeout parameter. */
@ -111,14 +111,12 @@ pthread_rwlock_timedrdlock:
movl %esi, %edx movl %esi, %edx
#if __ASSUME_PRIVATE_FUTEX #if __ASSUME_PRIVATE_FUTEX
movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx movzbl PSHARED(%ebp), %ecx
xorl PSHARED(%ebp), %ecx xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx
#else #else
# if FUTEX_WAIT == 0 movzbl PSHARED(%ebp), %ecx
movl PSHARED(%ebp), %ecx # if FUTEX_WAIT != 0
# else orl $FUTEX_WAIT, %ecx
movl $FUTEX_WAIT, %ecx
orl PSHARED(%ebp), %ecx
# endif # endif
xorl %gs:PRIVATE_FUTEX, %ecx xorl %gs:PRIVATE_FUTEX, %ecx
#endif #endif

View File

@ -109,14 +109,12 @@ pthread_rwlock_timedwrlock:
movl %esi, %edx movl %esi, %edx
#if __ASSUME_PRIVATE_FUTEX #if __ASSUME_PRIVATE_FUTEX
movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx movzbl PSHARED(%ebp), %ecx
xorl PSHARED(%ebp), %ecx xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx
#else #else
# if FUTEX_WAIT == 0 movzbl PSHARED(%ebp), %ecx
movl PSHARED(%ebp), %ecx # if FUTEX_WAIT != 0
# else orl $FUTEX_WAIT, %ecx
movl $FUTEX_WAIT, %ecx
orl PSHARED(%ebp), %ecx
# endif # endif
xorl %gs:PRIVATE_FUTEX, %ecx xorl %gs:PRIVATE_FUTEX, %ecx
#endif #endif

View File

@ -84,11 +84,11 @@ __pthread_rwlock_unlock:
8: 8:
#if __ASSUME_PRIVATE_FUTEX #if __ASSUME_PRIVATE_FUTEX
movl $FUTEX_PRIVATE_FLAG|FUTEX_WAKE, %ecx movzbl PSHARED(%edi), %ecx
xorl PSHARED(%edi), %ecx xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAKE, %ecx
#else #else
movl $FUTEX_WAKE, %ecx movzbl PSHARED(%edi), %ecx
orl PSHARED(%edi), %ecx orl $FUTEX_WAKE, %ecx
xorl %gs:PRIVATE_FUTEX, %ecx xorl %gs:PRIVATE_FUTEX, %ecx
#endif #endif
movl $SYS_futex, %eax movl $SYS_futex, %eax

View File

@ -77,14 +77,12 @@ __pthread_rwlock_wrlock:
11: 11:
#if __ASSUME_PRIVATE_FUTEX #if __ASSUME_PRIVATE_FUTEX
movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx movzbl PSHARED(%ebx), %ecx
xorl PSHARED(%ebx), %ecx xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx
#else #else
# if FUTEX_WAIT == 0 movzbl PSHARED(%ebx), %ecx
movl PSHARED(%ebx), %ecx # if FUTEX_WAIT != 0
# else orl $FUTEX_WAIT, %ecx
movl $FUTEX_WAIT, %ecx
orl PSHARED(%ebx), %ecx
# endif # endif
xorl %gs:PRIVATE_FUTEX, %ecx xorl %gs:PRIVATE_FUTEX, %ecx
#endif #endif

View File

@ -360,7 +360,6 @@ typedef struct
while (0) while (0)
#define THREAD_GSCOPE_SET_FLAG() \ #define THREAD_GSCOPE_SET_FLAG() \
THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED) THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED)
#define THREAD_GSCOPE_GET_FLAG(descr) (descr)->header.gscope_flag
#define THREAD_GSCOPE_WAIT() \ #define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) () GL(dl_wait_lookup_done) ()