Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 22 Nov 1999 20:53:18 +0000 (20:53 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 22 Nov 1999 20:53:18 +0000 (20:53 +0000)
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.

linuxthreads/ChangeLog
linuxthreads/internals.h
linuxthreads/manager.c
linuxthreads/pthread.c
linuxthreads_db/ChangeLog
linuxthreads_db/td_init.c
linuxthreads_db/thread_dbP.h

index 2a69af7..9e25884 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 1999-11-08  Ulrich Drepper  <drepper@cygnus.com>
 
        * pthread.c (__pthread_initialize_manager): Initialize
index f9eba6b..cd9091b 100644 (file)
@@ -343,6 +343,7 @@ void __pthread_perform_cleanup(void);
 int __pthread_initialize_manager(void);
 void __pthread_message(char * fmt, ...);
 int __pthread_manager(void *reqfd);
+int __pthread_manager_event(void *reqfd);
 void __pthread_manager_sighandler(int sig);
 void __pthread_reset_main_thread(void);
 void __fresetlockfiles(void);
index 21a3f68..0168b8a 100644 (file)
@@ -182,6 +182,21 @@ int __pthread_manager(void *arg)
   }
 }
 
+int __pthread_manager_event(void *arg)
+{
+  /* If we have special thread_self processing, initialize it.  */
+#ifdef INIT_THREAD_SELF
+  INIT_THREAD_SELF(&__pthread_manager_thread, 1);
+#endif
+
+  /* Get the lock the manager will free once all is correctly set up.  */
+  __pthread_lock (THREAD_GETMEM((&__pthread_manager_thread), p_lock), NULL);
+  /* Free it immediately.  */
+  __pthread_unlock (THREAD_GETMEM((&__pthread_manager_thread), p_lock));
+
+  return __pthread_manager(arg);
+}
+
 /* Process creation */
 
 static int pthread_start_thread(void *arg)
@@ -232,8 +247,11 @@ static int pthread_start_thread(void *arg)
 
 static int pthread_start_thread_event(void *arg)
 {
-  pthread_descr self = thread_self ();
+  pthread_descr self = (pthread_descr) arg;
 
+#ifdef INIT_THREAD_SELF
+  INIT_THREAD_SELF(self, self->p_nr);
+#endif
   /* Get the lock the manager will free once all is correctly set up.  */
   __pthread_lock (THREAD_GETMEM(self, p_lock), NULL);
   /* Free it immediately.  */
index ab1a0f1..bddec8c 100644 (file)
@@ -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]);
index 0ad9fd1..d3033cd 100644 (file)
@@ -1,3 +1,8 @@
+1999-11-22  Ulrich Drepper  <drepper@cygnus.com>
+
+       * thread_dbP.h (LOG): Only print message if __td_debug is nonzero.
+       * td_init.c: Add __td_debug.
+
 1999-11-12  Ulrich Drepper  <drepper@cygnus.com>
 
        * td_ta_thr_iter.c: Start copying list of descriptors from right
index e65edc4..683aec4 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "thread_dbP.h"
 
+int __td_debug;
+
 
 td_err_e
 td_init (void)
index 7e9fb48..13e534a 100644 (file)
@@ -9,7 +9,12 @@
 
 
 /* Comment out the following for less verbose output.  */
-#define LOG(c) __libc_write (2, c "\n", strlen (c "\n"))
+#ifndef NDEBUG
+# define LOG(c) if (__td_debug) __libc_write (2, c "\n", strlen (c "\n"))
+extern int __td_debug;
+#else
+# define LOG(c)
+#endif
 
 
 /* Handle for a process.  This type is opaque.  */