Commit 1717ec59 by Richard Kenner

(__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
parent f2433f89
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment