mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 08:21:25 +00:00
Some thread safety checks added.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13583 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
54a2f4a2dd
commit
a085710883
3 changed files with 50 additions and 12 deletions
|
@ -2,7 +2,12 @@
|
||||||
|
|
||||||
* Source/NSAssertion.m: Added comments and fixed bug in handling
|
* Source/NSAssertion.m: Added comments and fixed bug in handling
|
||||||
an assertion in a function ... was calling va_end() before the last
|
an assertion in a function ... was calling va_end() before the last
|
||||||
use of the arguments.
|
use of the arguments. Also, release new handler after adding it to
|
||||||
|
thread dictionary ... fix memory leak.
|
||||||
|
* Source/NSThread.m: Add fprintf of alert message to STDERR if we
|
||||||
|
are unable to determine the current thread. Don't attempt to use
|
||||||
|
NSLog() or similar ... since chances are, without a thread object,
|
||||||
|
that would just crash.
|
||||||
|
|
||||||
2002-05-02 Richard Frith-Macdonald <rfm@gnu.org>
|
2002-05-02 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ static NSString *dict_key = @"_NSAssertionHandler";
|
||||||
{
|
{
|
||||||
handler = [[NSAssertionHandler alloc] init];
|
handler = [[NSAssertionHandler alloc] init];
|
||||||
[dict setObject: handler forKey: dict_key];
|
[dict setObject: handler forKey: dict_key];
|
||||||
|
RELEASE(handler);
|
||||||
}
|
}
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,12 +83,14 @@ static BOOL entered_multi_threaded_state = NO;
|
||||||
*/
|
*/
|
||||||
static NSThread *defaultThread = nil;
|
static NSThread *defaultThread = nil;
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Fast access function to get current thread.
|
* Fast access function to get current thread.
|
||||||
*/
|
*/
|
||||||
inline NSThread*
|
inline NSThread*
|
||||||
GSCurrentThread()
|
GSCurrentThread()
|
||||||
{
|
{
|
||||||
|
NSThread *t;
|
||||||
|
|
||||||
if (entered_multi_threaded_state == NO)
|
if (entered_multi_threaded_state == NO)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -97,33 +99,48 @@ GSCurrentThread()
|
||||||
*/
|
*/
|
||||||
if (defaultThread == nil)
|
if (defaultThread == nil)
|
||||||
{
|
{
|
||||||
return [NSThread currentThread];
|
t = [NSThread currentThread];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return defaultThread;
|
t = defaultThread;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return (NSThread*)objc_thread_get_data();
|
t = (NSThread*)objc_thread_get_data();
|
||||||
|
if (t == nil)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ALERT ... GSCurrentThread() ... the "
|
||||||
|
"objc_thread_get_data() call returned nil!");
|
||||||
|
fflush(stderr); // Needed for windoze
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Fast access function for thread dictionary of current thread.
|
* Fast access function for thread dictionary of current thread.
|
||||||
*/
|
*/
|
||||||
NSMutableDictionary*
|
NSMutableDictionary*
|
||||||
GSCurrentThreadDictionary()
|
GSCurrentThreadDictionary()
|
||||||
{
|
{
|
||||||
NSThread *thread = GSCurrentThread();
|
NSThread *thread = GSCurrentThread();
|
||||||
NSMutableDictionary *dict = thread->_thread_dictionary;
|
|
||||||
|
|
||||||
if (dict == nil)
|
if (thread == nil)
|
||||||
{
|
{
|
||||||
dict = [thread threadDictionary];
|
return nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSMutableDictionary *dict = thread->_thread_dictionary;
|
||||||
|
|
||||||
|
if (dict == nil)
|
||||||
|
{
|
||||||
|
dict = [thread threadDictionary];
|
||||||
|
}
|
||||||
|
return dict;
|
||||||
}
|
}
|
||||||
return dict;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -159,18 +176,33 @@ gnustep_base_thread_callback()
|
||||||
*/
|
*/
|
||||||
+ (NSThread*) currentThread
|
+ (NSThread*) currentThread
|
||||||
{
|
{
|
||||||
|
NSThread *t;
|
||||||
|
|
||||||
if (entered_multi_threaded_state == NO)
|
if (entered_multi_threaded_state == NO)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The NSThread class has been initialized - so we will have a default
|
* The NSThread class has been initialized - so we will have a default
|
||||||
* thread set up.
|
* thread set up.
|
||||||
*/
|
*/
|
||||||
return defaultThread;
|
t = defaultThread;
|
||||||
|
if (t == nil)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ALERT ... [NSThread +currentThread] ... the "
|
||||||
|
"default thread is nil!");
|
||||||
|
fflush(stderr); // Needed for windoze
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return (NSThread*)objc_thread_get_data();
|
t = (NSThread*)objc_thread_get_data();
|
||||||
|
if (t == nil)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ALERT ... [NSThread +currentThread] ... the "
|
||||||
|
"objc_thread_get_data() call returned nil!");
|
||||||
|
fflush(stderr); // Needed for windoze
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue