(__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:
parent
f2433f89b4
commit
1717ec5915
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user