summaryrefslogtreecommitdiff
path: root/sysdeps/mach
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-25 02:33:13 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-25 02:33:13 +0200
commitb428baaa85c0adca9ef4884c637f289a0ab5e2d6 (patch)
tree2b886760ce40712db7282a83dcc3957bacabd42b /sysdeps/mach
parent1dc7553d93bf7f48b5f767b74eab607142d77160 (diff)
parent25260994c812050a5d7addf125cdc90c911ca5c1 (diff)
Merge branch 'master' of git.savannah.gnu.org:/srv/git/hurd/libpthread
Diffstat (limited to 'sysdeps/mach')
-rw-r--r--sysdeps/mach/hurd/ia32/pt-setup.c12
-rw-r--r--sysdeps/mach/hurd/pt-sysdep.c5
-rw-r--r--sysdeps/mach/hurd/pt-sysdep.h6
3 files changed, 10 insertions, 13 deletions
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 (); \