(__objc_thread_detach_function): Clear thread storage.
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 10 Jun 1996 15:58:41 +0000 (11:58 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 10 Jun 1996 15:58:41 +0000 (11:58 -0400)
Call the thread hook function when first becoming multi-threaded.
(objc_set_thread_callback): New function.

From-SVN: r12261

gcc/objc/thr.c

index db7787bc2c622dfaf236ec8a1dfbf24966f0dc1c..524723339cacd15e7bf67a08c69da7db1f28aee5 100644 (file)
@@ -32,10 +32,34 @@ Boston, MA 02111-1307, USA.  */
  */
 int     __objc_thread_exit_status = 0;          /* Global exit status.      */
 
+/* Flag which lets us know if we ever became multi threaded */
+int __objc_is_multi_threaded = 0;
+/* The hook function called when the runtime becomes multi threaded */
+objc_thread_callback _objc_became_multi_threaded = NULL;
+
 /*****************************************************************************
  *  Universal Functionality
  */
 
+/*
+  Use this to set the hook function that will be called when the 
+  runtime initially becomes multi threaded.
+  The hook function is only called once, meaning only when the 
+  2nd thread is spawned, not for each and every thread.
+
+  It returns the previous hook function or NULL if there is none.
+
+  A program outside of the runtime could set this to some function so
+  it can be informed; for example, the GNUstep Base Library sets it 
+  so it can implement the NSBecomingMultiThreaded notification.
+  */
+objc_thread_callback objc_set_thread_callback(objc_thread_callback func)
+{
+  objc_thread_callback temp = _objc_became_multi_threaded;
+  _objc_became_multi_threaded = func;
+  return temp;
+}
+
 /********
  *  First function called in a thread, starts everything else.
  */
@@ -57,6 +81,18 @@ __objc_thread_detach_function(struct __objc_thread_start_state *istate)
 
         free(istate);
 
+       /* Clear out the thread local storage */
+       objc_thread_set_data(NULL);
+
+       /* Check to see if we just became multi threaded */
+       if (!__objc_is_multi_threaded) {
+         __objc_is_multi_threaded = 1;
+
+         /* Call the hook function */
+         if (_objc_became_multi_threaded != NULL)
+           (*_objc_became_multi_threaded)();
+       }
+
         if ((imp = (id(*)(id, SEL, id))objc_msg_lookup(object, selector))) {
             (*imp)(object, selector, argument);
         }
@@ -93,6 +129,7 @@ objc_thread_detach(SEL selector, id object, id argument)
     free(istate);                           /* Release state if failed.   */
     return thread_id;
   }
+
   return thread_id;
 }