1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

* sysdeps/powerpc/tls.h (tcbhead_t): Add gscope_flag.

(THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED,
	THREAD_GSCOPE_FLAG_WAIT): Define.
	(THREAD_GSCOPE_GET_FLAG, THREAD_GSCOPE_SET_FLAG,
	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define.
	* sysdeps/i386/tls.h (THREAD_GSCOPE_WAIT): Don't use
	PTR_DEMANGLE.
	(THREAD_GSCOPE_GET_FLAG): Define.
	* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Define.
	* allocatestack.c (__wait_lookup_done): Use THREAD_GSCOPE_GET_FLAG
	instead of ->header.gscope_flag directly.
This commit is contained in:
Ulrich Drepper
2007-05-25 05:21:07 +00:00
parent ddfd053577
commit 0a54ab53f2
7 changed files with 65 additions and 26 deletions

View File

@ -34,13 +34,13 @@ extern int __REDIRECT (__open_2, (__const char *__file, int __oflag),
({ int ___r; \ ({ int ___r; \
/* If the compiler complains about an invalid type, excess elements, etc \ /* If the compiler complains about an invalid type, excess elements, etc \
in the initialization this means a paraleter of the wrong type has \ in the initialization this means a paraleter of the wrong type has \
been passed to open. */ \ been passed to open. */ \
int ___arr[] = { __VA_ARGS__ }; \ int ___arr[] = { __VA_ARGS__ }; \
if (__builtin_constant_p (flags) && (flags & O_CREAT) != 0) \ if (__builtin_constant_p (flags) && ((flags) & O_CREAT) != 0) \
{ \ { \
/* If the compile complains about the size of this array type the \ /* If the compile complains about the size of this array type the \
the mode parameter is missing since O_CREAT has been used. */ \ the mode parameter is missing since O_CREAT has been used. */ \
typedef int __open_missing_mode[(flags & O_CREAT) != 0 \ typedef int __open_missing_mode[((flags) & O_CREAT) != 0 \
? ((long int) sizeof (___arr) \ ? ((long int) sizeof (___arr) \
- (long int) sizeof (int)) : 1]; \ - (long int) sizeof (int)) : 1]; \
} \ } \
@ -66,11 +66,11 @@ extern int __open64_2 (__const char *__path, int __oflag);
in the initialization this means a paraleter of the wrong type has \ in the initialization this means a paraleter of the wrong type has \
been passed to open64. */ \ been passed to open64. */ \
int ___arr[] = { __VA_ARGS__ }; \ int ___arr[] = { __VA_ARGS__ }; \
if (__builtin_constant_p (flags) && (flags & O_CREAT) != 0) \ if (__builtin_constant_p (flags) && ((flags) & O_CREAT) != 0) \
{ \ { \
/* If the compile complains about the size of this array type the \ /* If the compile complains about the size of this array type the \
the mode parameter is missing since O_CREAT has been used. */ \ the mode parameter is missing since O_CREAT has been used. */ \
typedef int __open_missing_mode[(flags & O_CREAT) != 0 \ typedef int __open_missing_mode[((flags) & O_CREAT) != 0 \
? ((long int) sizeof (___arr) \ ? ((long int) sizeof (___arr) \
- (long int) sizeof (int)) : 1]; \ - (long int) sizeof (int)) : 1]; \
} \ } \
@ -102,11 +102,11 @@ extern int __REDIRECT (__openat_2, (int __fd, __const char *__file,
in the initialization this means a paraleter of the wrong type has \ in the initialization this means a paraleter of the wrong type has \
been passed to openat. */ \ been passed to openat. */ \
int ___arr[] = { __VA_ARGS__ }; \ int ___arr[] = { __VA_ARGS__ }; \
if (__builtin_constant_p (flags) && (flags & O_CREAT) != 0) \ if (__builtin_constant_p (flags) && ((flags) & O_CREAT) != 0) \
{ \ { \
/* If the compile complains about the size of this array type the \ /* If the compile complains about the size of this array type the \
the mode parameter is missing since O_CREAT has been used. */ \ the mode parameter is missing since O_CREAT has been used. */ \
typedef int __open_missing_mode[(flags & O_CREAT) != 0 \ typedef int __open_missing_mode[((flags) & O_CREAT) != 0 \
? ((long int) sizeof (___arr) \ ? ((long int) sizeof (___arr) \
- (long int) sizeof (int)) : 1]; \ - (long int) sizeof (int)) : 1]; \
} \ } \
@ -132,11 +132,11 @@ extern int __openat64_2 (int __fd, __const char *__path, int __oflag);
in the initialization this means a paraleter of the wrong type has \ in the initialization this means a paraleter of the wrong type has \
been passed to openat64. */ \ been passed to openat64. */ \
int ___arr[] = { __VA_ARGS__ }; \ int ___arr[] = { __VA_ARGS__ }; \
if (__builtin_constant_p (flags) && (flags & O_CREAT) != 0) \ if (__builtin_constant_p (flags) && ((flags) & O_CREAT) != 0) \
{ \ { \
/* If the compile complains about the size of this array type the \ /* If the compile complains about the size of this array type the \
the mode parameter is missing since O_CREAT has been used. */ \ the mode parameter is missing since O_CREAT has been used. */ \
typedef int __open_missing_mode[(flags & O_CREAT) != 0 \ typedef int __open_missing_mode[((flags) & O_CREAT) != 0 \
? ((long int) sizeof (___arr) \ ? ((long int) sizeof (___arr) \
- (long int) sizeof (int)) : 1]; \ - (long int) sizeof (int)) : 1]; \
} \ } \

View File

@ -1,3 +1,17 @@
2007-05-24 Jakub Jelinek <jakub@redhat.com>
* sysdeps/powerpc/tls.h (tcbhead_t): Add gscope_flag.
(THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED,
THREAD_GSCOPE_FLAG_WAIT): Define.
(THREAD_GSCOPE_GET_FLAG, THREAD_GSCOPE_SET_FLAG,
THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define.
* sysdeps/i386/tls.h (THREAD_GSCOPE_WAIT): Don't use
PTR_DEMANGLE.
(THREAD_GSCOPE_GET_FLAG): Define.
* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Define.
* allocatestack.c (__wait_lookup_done): Use THREAD_GSCOPE_GET_FLAG
instead of ->header.gscope_flag directly.
2007-05-23 Ulrich Drepper <drepper@redhat.com> 2007-05-23 Ulrich Drepper <drepper@redhat.com>
* init.c (__pthread_initialize_minimal_internal): Check whether * init.c (__pthread_initialize_minimal_internal): Check whether

View File

@ -1023,10 +1023,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 || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) if (t == self || THREAD_GSCOPE_GET_FLAG (t) == THREAD_GSCOPE_FLAG_UNUSED)
continue; continue;
int *const gscope_flagp = &t->header.gscope_flag; int *const gscope_flagp = &THREAD_GSCOPE_GET_FLAG (t);
/* 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
@ -1045,10 +1045,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 || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) if (t == self || THREAD_GSCOPE_GET_FLAG (t) == THREAD_GSCOPE_FLAG_UNUSED)
continue; continue;
int *const gscope_flagp = &t->header.gscope_flag; int *const gscope_flagp = &THREAD_GSCOPE_GET_FLAG (t);
/* 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

@ -454,16 +454,9 @@ 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)
#ifdef PTR_DEMANGLE #define THREAD_GSCOPE_GET_FLAG(descr) (descr)->header.gscope_flag
# define THREAD_GSCOPE_WAIT() \ #define THREAD_GSCOPE_WAIT() \
do { void (*ptr) (void) = GL(dl_wait_lookup_done); \
PTR_DEMANGLE (ptr); \
ptr (); \
} while (0)
#else
# define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) () GL(dl_wait_lookup_done) ()
#endif
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */

View File

@ -1,5 +1,5 @@
/* Definition for thread-local data handling. NPTL/PowerPC version. /* Definition for thread-local data handling. NPTL/PowerPC 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
@ -63,10 +63,11 @@ 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 and pointer_guard fields so it is a part of public ABI. The dtv, pointer_guard and gscope_flag
are private. */ fields 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;
@ -180,6 +181,27 @@ 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. */
#define THREAD_GSCOPE_FLAG_UNUSED 0
#define THREAD_GSCOPE_FLAG_USED 1
#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() \
do \
{ int __res \
= atomic_exchange_rel (&THREAD_GSCOPE_GET_FLAG (THREAD_SELF), \
THREAD_GSCOPE_FLAG_UNUSED); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_GSCOPE_GET_FLAG (THREAD_SELF), 1); \
} \
while (0)
#define THREAD_GSCOPE_SET_FLAG() \
(THREAD_GSCOPE_GET_FLAG (THREAD_SELF) = THREAD_GSCOPE_FLAG_USED)
#define THREAD_GSCOPE_WAIT() \
GL(dl_wait_lookup_done) ()
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* tls.h */ #endif /* tls.h */

View File

@ -360,6 +360,7 @@ 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) ()

View File

@ -63,6 +63,15 @@ __open64_2 (file, oflag)
if (oflag & O_CREAT) if (oflag & O_CREAT)
__fortify_fail ("invalid open64 call: O_CREAT without mode"); __fortify_fail ("invalid open64 call: O_CREAT without mode");
return __open64 (file, oflag); if (SINGLE_THREAD_P)
return INLINE_SYSCALL (open, 2, file, oflag | O_LARGEFILE);
int oldtype = LIBC_CANCEL_ASYNC ();
int result = INLINE_SYSCALL (open, 2, file, oflag | O_LARGEFILE);
LIBC_CANCEL_RESET (oldtype);
return result;
} }
#endif #endif