diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-04-27 01:32:54 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-04-27 01:37:36 +0000 |
commit | 25260994c812050a5d7addf125cdc90c911ca5c1 (patch) | |
tree | 255b2ba5ba5b799b1a5f23aef17d75534103de0a | |
parent | e84c82a43e671c7506401936ac097b55d0fb47bf (diff) |
Store self in __thread variable instead of threadvar
* sysdeps/mach/hurd/pt-sysdep.h (_HURD_THREADVAR_THREAD): Remove macro.
(___pthread_self): Declare new __thread variable.
(_pthread_self): Take self pointer from ___pthread_self instead of
threadvar.
* sysdeps/mach/hurd/pt-sysdep.c (___pthread_self): Define new __thread
variable.
(init_routine): Set ___pthread_self to initial thread structure.
* pthread/pt-internal.h (__pthread_setup): Add `self' parameter to
`entry_point' parameter.
* pthread/pt-create.c (entry_point): Add `self' parameter. Store it in
___pthread_self.
* sysdeps/l4/hurd/ia32/pt-setup.c (stack_setup): Add `self parameter to
`entry_point' parameter. Pass it the `thread' parameter.
(__pthread_setup): Likewise.
* sysdeps/l4/hurd/powerpc/pt-setup.c (struct start_info): Add `self' field.
(first_entry_1): Pass `self' parameter.
(stack_setup): Add `self' parameter to `entry_point' parameter, pass it the
`thread' parameter.
(__pthread_setup): Likewise.
* sysdeps/mach/hurd/ia32/pt-setup.c (stack_setup): Pass `thread' parameter
to the start routine.
(stack_setup): Add `self' parameter to `entry_point' paramter.
-rw-r--r-- | pthread/pt-create.c | 6 | ||||
-rw-r--r-- | pthread/pt-internal.h | 3 | ||||
-rw-r--r-- | sysdeps/l4/hurd/ia32/pt-setup.c | 5 | ||||
-rw-r--r-- | sysdeps/l4/hurd/powerpc/pt-setup.c | 7 | ||||
-rw-r--r-- | sysdeps/mach/hurd/ia32/pt-setup.c | 12 | ||||
-rw-r--r-- | sysdeps/mach/hurd/pt-sysdep.c | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/pt-sysdep.h | 6 |
7 files changed, 25 insertions, 19 deletions
diff --git a/pthread/pt-create.c b/pthread/pt-create.c index ca6b66c..4d81a95 100644 --- a/pthread/pt-create.c +++ b/pthread/pt-create.c @@ -38,8 +38,12 @@ __atomic_t __pthread_total; /* The entry-point for new threads. */ static void -entry_point (void *(*start_routine)(void *), void *arg) +entry_point (struct __pthread *self, void *(*start_routine)(void *), void *arg) { +#ifdef ENABLE_TLS + ___pthread_self = self; +#endif + #ifdef HAVE_USELOCALE /* A fresh thread needs to be bound to the global locale. */ uselocale (LC_GLOBAL_LOCALE); diff --git a/pthread/pt-internal.h b/pthread/pt-internal.h index a1da377..f5766e9 100644 --- a/pthread/pt-internal.h +++ b/pthread/pt-internal.h @@ -217,7 +217,8 @@ extern void __pthread_stack_dealloc (void *stackaddr, size_t stacksize); /* Setup thread THREAD's context. */ extern int __pthread_setup (struct __pthread *__restrict thread, - void (*entry_point)(void *(*)(void *), + void (*entry_point)(struct __pthread *, + void *(*)(void *), void *), void *(*start_routine)(void *), void *__restrict arg); diff --git a/sysdeps/l4/hurd/ia32/pt-setup.c b/sysdeps/l4/hurd/ia32/pt-setup.c index 579905c..de7359c 100644 --- a/sysdeps/l4/hurd/ia32/pt-setup.c +++ b/sysdeps/l4/hurd/ia32/pt-setup.c @@ -65,7 +65,7 @@ __pthread_entry_point:\n\ static void * stack_setup (struct __pthread *thread, void *(*start_routine)(void *), void *arg, - void (*entry_point)(void *(*)(void *), void *)) + void (*entry_point)(struct __pthread *, void *(*)(void *), void *)) { uintptr_t *top; @@ -80,6 +80,7 @@ stack_setup (struct __pthread *thread, /* Set up call frame. */ *--top = (uintptr_t) arg; /* Argument to START_ROUTINE. */ *--top = (uintptr_t) start_routine; + *--top = (uintptr_t) thread; *--top = 0; /* Fake return address. */ *--top = (uintptr_t) entry_point; } @@ -89,7 +90,7 @@ stack_setup (struct __pthread *thread, int __pthread_setup (struct __pthread *thread, - void (*entry_point)(void *(*)(void *), void *), + void (*entry_point)(struct __pthread *, void *(*)(void *), void *), void *(*start_routine)(void *), void *arg) { thread->mcontext.pc = (void *) &_pthread_entry_point; diff --git a/sysdeps/l4/hurd/powerpc/pt-setup.c b/sysdeps/l4/hurd/powerpc/pt-setup.c index d3cf4ec..d309216 100644 --- a/sysdeps/l4/hurd/powerpc/pt-setup.c +++ b/sysdeps/l4/hurd/powerpc/pt-setup.c @@ -28,6 +28,7 @@ struct start_info { void (*entry_point) (void *(*)(void *), void *); + struct __pthread *self; void *(*start_routine) (void *); void *arg; }; @@ -41,6 +42,7 @@ first_entry_1: ;\ lwz 0, 0(1) ;\ lwz 3, 4(1) ;\ lwz 4, 8(1) ;\ + lwz 5, 12(1) ;\ mtctr 0 ;\ bctrl ;\ "); @@ -51,7 +53,7 @@ first_entry_1: ;\ opportunity to install THREAD in our utcb. */ static void * stack_setup (struct __pthread *thread, - void (*entry_point)(void *(*)(void *), void *), + void (*entry_point)(struct __pthread *, void *(*)(void *), void *), void *(*start_routine)(void *), void *arg) { l4_word_t *top; @@ -68,6 +70,7 @@ stack_setup (struct __pthread *thread, struct start_info *info = ((struct start_info *) top) - 1; info->entry_point = entry_point; + info->self = thread; info->start_routine = start_routine; info->arg = arg; return (void *) info; @@ -77,7 +80,7 @@ stack_setup (struct __pthread *thread, int __pthread_setup (struct __pthread *thread, - void (*entry_point)(void *(*)(void *), void *), + void (*entry_point)(struct __pthread *, void *(*)(void *), void *), void *(*start_routine)(void *), void *arg) { thread->mcontext.pc = first_entry_1; diff --git a/sysdeps/mach/hurd/ia32/pt-setup.c b/sysdeps/mach/hurd/ia32/pt-setup.c index 5420dc8..73fd43d 100644 --- a/sysdeps/mach/hurd/ia32/pt-setup.c +++ b/sysdeps/mach/hurd/ia32/pt-setup.c @@ -57,16 +57,14 @@ stack_setup (struct __pthread *thread, /* Next, make room for the TSDs. */ top -= __hurd_threadvar_max; - /* Save the self pointer. */ - top[_HURD_THREADVAR_THREAD] = (uintptr_t) thread; - if (start_routine) { /* And then the call frame. */ - top -= 2; + top -= 3; top = (uintptr_t *) ((uintptr_t) top & ~0xf); - top[1] = (uintptr_t) arg; /* Argument to START_ROUTINE. */ - top[0] = (uintptr_t) start_routine; + top[2] = (uintptr_t) arg; /* Argument to START_ROUTINE. */ + top[1] = (uintptr_t) start_routine; + top[0] = (uintptr_t) thread; *--top = 0; /* Fake return address. */ } @@ -82,7 +80,7 @@ stack_setup (struct __pthread *thread, int __pthread_setup (struct __pthread *thread, - void (*entry_point)(void *(*)(void *), void *), + void (*entry_point)(struct __pthread *, void *(*)(void *), void *), void *(*start_routine)(void *), void *arg) { error_t err; diff --git a/sysdeps/mach/hurd/pt-sysdep.c b/sysdeps/mach/hurd/pt-sysdep.c index 95a4d36..f40fee5 100644 --- a/sysdeps/mach/hurd/pt-sysdep.c +++ b/sysdeps/mach/hurd/pt-sysdep.c @@ -28,6 +28,8 @@ #include <pt-internal.h> +__thread struct __pthread *___pthread_self; + /* Forward. */ static void *init_routine (void); @@ -51,8 +53,7 @@ init_routine (void) err = __pthread_create_internal (&thread, 0, 0, 0); assert_perror (err); - ((void **) (__hurd_threadvar_stack_offset))[_HURD_THREADVAR_THREAD] - = thread; + ___pthread_self = thread; /* Decrease the number of threads, to take into account that the signal thread (which will be created by the glibc startup code diff --git a/sysdeps/mach/hurd/pt-sysdep.h b/sysdeps/mach/hurd/pt-sysdep.h index 13e235d..bec1b40 100644 --- a/sysdeps/mach/hurd/pt-sysdep.h +++ b/sysdeps/mach/hurd/pt-sysdep.h @@ -35,15 +35,13 @@ mach_msg_header_t wakeupmsg; \ int have_kernel_resources; -#define _HURD_THREADVAR_THREAD _HURD_THREADVAR_DYNAMIC_USER - +extern __thread struct __pthread *___pthread_self; #define _pthread_self() \ ({ \ struct __pthread *thread; \ \ assert (__pthread_threads); \ - thread = *(struct __pthread **) \ - __hurd_threadvar_location (_HURD_THREADVAR_THREAD); \ + thread = ___pthread_self; \ \ assert (thread); \ assert (({ mach_port_t ktid = __mach_thread_self (); \ |