From 1717ec59158d5250140e479fd0fa5e57bc67f4e6 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Mon, 10 Jun 1996 11:58:41 -0400 Subject: [PATCH] (__objc_thread_detach_function): Clear thread storage. Call the thread hook function when first becoming multi-threaded. (objc_set_thread_callback): New function. From-SVN: r12261 --- gcc/objc/thr.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/gcc/objc/thr.c b/gcc/objc/thr.c index db7787b..5247233 100644 --- a/gcc/objc/thr.c +++ b/gcc/objc/thr.c @@ -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; } -- 2.7.4