Wrap lock protected sections with exception handlers.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@7935 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2000-10-30 20:43:09 +00:00
parent bd3f11f705
commit 9cc8120bc2
2 changed files with 70 additions and 21 deletions

View file

@ -1,5 +1,7 @@
2000-10-30 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSURLHandle.m: Wrap all locking with exception handlers to
ensure that locks are released.
* Headers/gnustep/base/NSInvocation.h: Removed non-standard macros
* Headers/gnustep/base/behavior.h: Removed unused macro
CALL_METHOD_IN_CLASS()

View file

@ -97,31 +97,49 @@ static Class NSURLHandleClass = 0;
* be used in preference to any class added earlier.
*/
[registryLock lock];
[registry removeObjectIdenticalTo: urlHandleSubclass];
[registry addObject: urlHandleSubclass];
NS_DURING
{
[registry removeObjectIdenticalTo: urlHandleSubclass];
[registry addObject: urlHandleSubclass];
}
NS_HANDLER
{
[registryLock unlock];
[localException raise];
}
NS_ENDHANDLER
[registryLock unlock];
}
+ (Class) URLHandleClassForURL: (NSURL*)url
{
unsigned count;
Class c = 0;
[registryLock lock];
count = [registry count];
/*
* Find a class to handle the URL, try most recently registered first.
*/
while (count-- > 0)
NS_DURING
{
id found = [registry objectAtIndex: count];
count = [registry count];
if ([found canInitWithURL: url] == YES)
/*
* Find a class to handle the URL, try most recently registered first.
*/
while (count-- > 0)
{
[registryLock unlock];
return (Class)found;
id found = [registry objectAtIndex: count];
if ([found canInitWithURL: url] == YES)
{
c = (Class)found;
}
}
}
NS_HANDLER
{
[registryLock unlock];
[localException raise];
}
NS_ENDHANDLER
[registryLock unlock];
return 0;
}
@ -404,8 +422,17 @@ static NSLock *fileLock = nil;
path = [path stringByStandardizingPath];
[fileLock lock];
obj = [fileCache objectForKey: path];
AUTORELEASE(RETAIN(obj));
NS_DURING
{
obj = [fileCache objectForKey: path];
AUTORELEASE(RETAIN(obj));
}
NS_HANDLER
{
[fileLock unlock];
[localException raise];
}
NS_ENDHANDLER
[fileLock unlock];
}
return obj;
@ -451,15 +478,26 @@ static NSLock *fileLock = nil;
id obj;
[fileLock lock];
obj = [fileCache objectForKey: path];
NS_DURING
{
obj = [fileCache objectForKey: path];
if (obj != nil)
{
DESTROY(self);
RETAIN(obj);
}
}
NS_HANDLER
{
[fileLock unlock];
[localException raise];
}
NS_ENDHANDLER
[fileLock unlock];
if (obj != nil)
{
RELEASE(self);
self = RETAIN(obj);
[fileLock unlock];
return self;
return obj;
}
[fileLock unlock];
}
if ((self = [super initWithURL: url cached: cached]) != nil)
@ -468,7 +506,16 @@ static NSLock *fileLock = nil;
if (cached == YES)
{
[fileLock lock];
[fileCache setObject: self forKey: _path];
NS_DURING
{
[fileCache setObject: self forKey: _path];
}
NS_HANDLER
{
[fileLock unlock];
[localException raise];
}
NS_ENDHANDLER
[fileLock unlock];
}
}