(__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
This commit is contained in:
Richard Kenner 1996-06-10 11:58:41 -04:00
parent f2433f89b4
commit 1717ec5915

View 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;
}