diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-11-22 20:53:18 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-11-22 20:53:18 +0000 |
commit | 20bdb31bfc27e044290756a681e3329f6e677ab7 (patch) | |
tree | 83fcba351926c80cad192dfb56ee8e42ac3535d3 /linuxthreads/pthread.c | |
parent | ba90ec1141c97aa17bfe701f0f9def3f7544895f (diff) | |
download | glibc-20bdb31bfc27e044290756a681e3329f6e677ab7.zip glibc-20bdb31bfc27e044290756a681e3329f6e677ab7.tar.gz glibc-20bdb31bfc27e044290756a681e3329f6e677ab7.tar.bz2 |
Update.
1999-11-22 Ulrich Drepper <drepper@cygnus.com>
* internals.h: Add prototype for __pthread_manager_event.
* manager.c (__pthread_manager_event): New function.
(pthread_start_thread_event): Correct computation of self.
Use INIT_THREAD_SELF.
* pthread.c (__pthread_manager_thread): Initialize p_lock.
(__pthread_initialize_manager): Respect event flags also for creation
of the manager thread.
Diffstat (limited to 'linuxthreads/pthread.c')
-rw-r--r-- | linuxthreads/pthread.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index ab1a0f1..bddec8c 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -84,7 +84,7 @@ struct _pthread_descr_struct __pthread_manager_thread = { 0, /* int p_tid */ 0, /* int p_pid */ 0, /* int p_priority */ - NULL, /* struct _pthread_fastlock * p_lock */ + &__pthread_handles[1].h_lock, /* struct _pthread_fastlock * p_lock */ 0, /* int p_signal */ NULL, /* sigjmp_buf * p_signal_buf */ NULL, /* sigjmp_buf * p_cancel_buf */ @@ -387,9 +387,49 @@ int __pthread_initialize_manager(void) return -1; } /* Start the thread manager */ - pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos, - CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND - , (void *)(long)manager_pipe[0]); + pid = 0; + if (__pthread_initial_thread.p_report_events) + { + /* It's a bit more complicated. We have to report the creation of + the manager thread. */ + int idx = __td_eventword (TD_CREATE); + uint32_t mask = __td_eventmask (TD_CREATE); + + if ((mask & (__pthread_threads_events.event_bits[idx] + | __pthread_initial_thread.p_eventbuf.eventmask.event_bits[idx])) + != 0) + { + pid = __clone(__pthread_manager_event, + (void **) __pthread_manager_thread_tos, + CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, + (void *)(long)manager_pipe[0]); + + if (pid != -1) + { + /* Now fill in the information about the new thread in + the newly created thread's data structure. We cannot let + the new thread do this since we don't know whether it was + already scheduled when we send the event. */ + __pthread_manager_thread.p_eventbuf.eventdata = + &__pthread_manager_thread; + __pthread_manager_thread.p_eventbuf.eventnum = TD_CREATE; + __pthread_last_event = &__pthread_manager_thread; + __pthread_manager_thread.p_tid = 2* PTHREAD_THREADS_MAX + 1; + __pthread_manager_thread.p_pid = pid; + + /* Now call the function which signals the event. */ + __linuxthreads_create_event (); + + /* Now restart the thread. */ + __pthread_unlock(__pthread_manager_thread.p_lock); + } + } + } + + if (pid == 0) + pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos, + CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, + (void *)(long)manager_pipe[0]); if (pid == -1) { free(__pthread_manager_thread_bos); __libc_close(manager_pipe[0]); |