1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00
2003-09-17  Jakub Jelinek  <jakub@redhat.com>

	* pthread.c (manager_thread): Remove static, add attribute_hidden.
	(thread_self_stack): Rename to...
	(__pthread_self_stack): ... this.  Remove static.
	(pthread_handle_sigcancel): Use check_thread_self ().
	(pthread_handle_sigrestart): Likewise.
	* sighandler.c (__pthread_sighandler, __pthread_sighandler_rt):
	Likewise.
	* descr.h (manager_thread): Declare.
	* internals.h (__pthread_self_stack): New prototype.
	(__manager_thread): Define.
	(check_thread_self): New function.
This commit is contained in:
Ulrich Drepper
2003-09-17 05:04:16 +00:00
parent 65947215c7
commit a243f94e36
4 changed files with 46 additions and 2 deletions

View File

@ -363,6 +363,7 @@ extern int __pthread_condattr_init (pthread_condattr_t *attr);
extern int __pthread_condattr_destroy (pthread_condattr_t *attr);
extern pthread_t __pthread_self (void);
extern pthread_descr __pthread_thread_self (void);
extern pthread_descr __pthread_self_stack (void) attribute_hidden;
extern int __pthread_equal (pthread_t thread1, pthread_t thread2);
extern void __pthread_exit (void *retval);
extern int __pthread_getschedparam (pthread_t thread, int *policy,
@ -522,4 +523,30 @@ weak_extern (__pthread_thread_self)
# endif
#endif
#ifndef USE_TLS
# define __manager_thread (&__pthread_manager_thread)
#else
# define __manager_thread manager_thread
#endif
extern inline __attribute__((always_inline)) pthread_descr
check_thread_self (void)
{
pthread_descr self = thread_self ();
#if defined THREAD_SELF && defined INIT_THREAD_SELF
if (self == __manager_thread)
{
/* A new thread might get a cancel signal before it is fully
initialized, so that the thread register might still point to the
manager thread. Double check that this is really the manager
thread. */
self = __pthread_self_stack();
if (self != __manager_thread)
/* Oops, thread_self() isn't working yet.. */
INIT_THREAD_SELF(self, self->p_nr);
}
#endif
return self;
}
#endif /* internals.h */