From f994d1ee904ffd213ece1fc6fa1d6ec888d9fcab Mon Sep 17 00:00:00 2001 From: richard Date: Mon, 30 Oct 2000 20:43:09 +0000 Subject: [PATCH] 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 --- ChangeLog | 2 + Source/NSURLHandle.m | 89 +++++++++++++++++++++++++++++++++----------- 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30311233e..14a8e7f5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2000-10-30 Richard Frith-Macdonald + * 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() diff --git a/Source/NSURLHandle.m b/Source/NSURLHandle.m index 0ba37c23e..b16971cb8 100644 --- a/Source/NSURLHandle.m +++ b/Source/NSURLHandle.m @@ -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]; } }