diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-07-01 15:58:55 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-07-01 15:58:55 +0200 |
commit | 96dc2ae69c8ab627e48e42354710ea12d62d70aa (patch) | |
tree | 03605e5ef10524d33e6501a89d8c26e9c4a1833e /objective-c | |
parent | Fix for ICE-8175 - IceStorm/repstress hang, run test on test driver main thread (diff) | |
download | ice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.tar.bz2 ice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.tar.xz ice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.zip |
Fixes for ICE-8204 - Objective-C leak fixes
Diffstat (limited to 'objective-c')
12 files changed, 71 insertions, 34 deletions
diff --git a/objective-c/include/objc/Ice/Initialize.h b/objective-c/include/objc/Ice/Initialize.h index 39e8427875b..4f8fa378c2a 100644 --- a/objective-c/include/objc/Ice/Initialize.h +++ b/objective-c/include/objc/Ice/Initialize.h @@ -47,10 +47,12 @@ ICE_API @interface ICEInitializationData : NSObject @property(retain, nonatomic) NSDictionary* prefixTable_; -(id) init:(id<ICEProperties>)properties logger:(id<ICELogger>)logger - dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d; + dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d + batchRequestInterceptor:(void(^)(id<ICEBatchRequest>, int, int))i; +(id) initializationData; +(id) initializationData:(id<ICEProperties>)properties logger:(id<ICELogger>)logger - dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d; + dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d + batchRequestInterceptor:(void(^)(id<ICEBatchRequest>, int, int))i; // This class also overrides copyWithZone:, hash, isEqual:, and dealloc. @end diff --git a/objective-c/src/Ice/CommunicatorI.mm b/objective-c/src/Ice/CommunicatorI.mm index 35f33bebca2..fc390b0db8f 100644 --- a/objective-c/src/Ice/CommunicatorI.mm +++ b/objective-c/src/Ice/CommunicatorI.mm @@ -546,7 +546,7 @@ { [adminFacets_ removeObjectForKey:facet]; } - return toObjC(COMMUNICATOR->removeAdminFacet(fromNSString(facet))); + return [toObjC(COMMUNICATOR->removeAdminFacet(fromNSString(facet))) autorelease]; } catch(const std::exception& ex) { @@ -564,14 +564,14 @@ ICEObject* obj = [adminFacets_ objectForKey:facet]; if(obj != nil) { - return obj; + return [[obj retain] autorelease]; } obj = toObjC(COMMUNICATOR->findAdminFacet(fromNSString(facet))); if(obj != nil) { [adminFacets_ setObject:obj forKey:facet]; } - return obj; + return [obj autorelease]; } } catch(const std::exception& ex) @@ -590,7 +590,7 @@ { [adminFacets_ addEntriesFromDictionary:facetMap]; } - return facetMap; + return [facetMap autorelease]; } catch(const std::exception& ex) { diff --git a/objective-c/src/Ice/Initialize.mm b/objective-c/src/Ice/Initialize.mm index 3813a2b8b9d..12ea52cdf89 100644 --- a/objective-c/src/Ice/Initialize.mm +++ b/objective-c/src/Ice/Initialize.mm @@ -189,8 +189,9 @@ private: @synthesize batchRequestInterceptor; @synthesize prefixTable_; --(id) init:(id<ICEProperties>)props logger:(id<ICELogger>)log dispatcher:(void(^)(id<ICEDispatcherCall>, - id<ICEConnection>))d; +-(id) init:(id<ICEProperties>)props logger:(id<ICELogger>)log + dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d + batchRequestInterceptor:(void(^)(id<ICEBatchRequest>, int, int))i; { self = [super init]; if(!self) @@ -200,6 +201,7 @@ private: properties = [props retain]; logger = [log retain]; dispatcher = [d copy]; + batchRequestInterceptor = [i copy]; return self; } @@ -211,9 +213,11 @@ private: } +(id) initializationData:(id<ICEProperties>)p logger:(id<ICELogger>)l - dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d; + dispatcher:(void(^)(id<ICEDispatcherCall>, id<ICEConnection>))d + batchRequestInterceptor:(void(^)(id<ICEBatchRequest>, int, int))i; { - return [[((ICEInitializationData *)[ICEInitializationData alloc]) init:p logger:l dispatcher:d] autorelease]; + return [[((ICEInitializationData *)[ICEInitializationData alloc]) init:p logger:l dispatcher:d + batchRequestInterceptor:i] autorelease]; } -(id) copyWithZone:(NSZone *)zone @@ -222,6 +226,7 @@ private: copy->properties = [properties retain]; copy->logger = [logger retain]; copy->dispatcher = [dispatcher copy]; + copy->batchRequestInterceptor = [batchRequestInterceptor copy]; copy->prefixTable_ = [prefixTable_ retain]; return copy; } @@ -231,6 +236,8 @@ private: NSUInteger h = 0; h = (h << 5 ^ [properties hash]); h = (h << 5 ^ [logger hash]); + h = (h << 5 ^ [dispatcher hash]); + h = (h << 5 ^ [batchRequestInterceptor hash]); h = (h << 5 ^ [prefixTable_ hash]); return h; } @@ -288,6 +295,20 @@ private: return NO; } } + if(!batchRequestInterceptor) + { + if(obj->batchRequestInterceptor) + { + return NO; + } + } + else + { + if(batchRequestInterceptor == obj->batchRequestInterceptor) + { + return NO; + } + } if(!prefixTable_) { if(obj->prefixTable_) @@ -310,6 +331,7 @@ private: [properties release]; [logger release]; [dispatcher release]; + [batchRequestInterceptor release]; [prefixTable_ release]; [super dealloc]; } diff --git a/objective-c/src/Ice/Object.mm b/objective-c/src/Ice/Object.mm index bbace1b827f..fb058a810b5 100644 --- a/objective-c/src/Ice/Object.mm +++ b/objective-c/src/Ice/Object.mm @@ -618,7 +618,7 @@ static NSString* ICEObject_all[4] = object_->__decRef(); [super dealloc]; } -+(id) servantWrapperWithCxxObject:(Ice::Object*)arg ++(id) servantWrapperWithCxxObjectNoAutoRelease:(Ice::Object*)arg { @synchronized([ICEServantWrapper class]) { @@ -629,7 +629,7 @@ static NSString* ICEObject_all[4] = } else { - return [[(ICEServantWrapper*)[self alloc] initWithCxxObject:arg] autorelease]; + return [(ICEServantWrapper*)[self alloc] initWithCxxObject:arg]; } } } diff --git a/objective-c/src/Ice/ObjectAdapterI.mm b/objective-c/src/Ice/ObjectAdapterI.mm index d3ae9a3cc46..9ca18673401 100644 --- a/objective-c/src/Ice/ObjectAdapterI.mm +++ b/objective-c/src/Ice/ObjectAdapterI.mm @@ -514,7 +514,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toObjC(OBJECTADAPTER->remove([ident identity])); + return [toObjC(OBJECTADAPTER->remove([ident identity])) autorelease]; } catch(const std::exception& ex) { @@ -528,7 +528,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toObjC(OBJECTADAPTER->removeFacet([ident identity], fromNSString(facet))); + return [toObjC(OBJECTADAPTER->removeFacet([ident identity], fromNSString(facet))) autorelease]; } catch(const std::exception& ex) { @@ -543,7 +543,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toNSDictionary(OBJECTADAPTER->removeAllFacets([ident identity])); + return [toNSDictionary(OBJECTADAPTER->removeAllFacets([ident identity])) autorelease]; } catch(const std::exception& ex) { @@ -568,7 +568,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; { return nil; } - return toObjC(defaultServantLocator->servant()); + return [toObjC(defaultServantLocator->servant()) autorelease]; } catch(const std::exception& ex) { @@ -583,7 +583,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toObjC(OBJECTADAPTER->find([ident identity])); + return [toObjC(OBJECTADAPTER->find([ident identity])) autorelease]; } catch(const std::exception& ex) { @@ -598,7 +598,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toObjC(OBJECTADAPTER->findFacet([ident identity], fromNSString(facet))); + return [toObjC(OBJECTADAPTER->findFacet([ident identity], fromNSString(facet))) autorelease]; } catch(const std::exception& ex) { @@ -628,7 +628,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; NSException* nsex = nil; try { - return toObjC(OBJECTADAPTER->findByProxy([(ICEObjectPrx*)proxy iceObjectPrx])); + return [toObjC(OBJECTADAPTER->findByProxy([(ICEObjectPrx*)proxy iceObjectPrx])) autorelease]; } catch(const std::exception& ex) { @@ -698,7 +698,7 @@ typedef IceUtil::Handle<ServantLocatorWrapper> ServantLocatorWrapperPtr; } else { - return toObjC(defaultServantLocator->servant()); + return [toObjC(defaultServantLocator->servant()) autorelease]; } } catch(const std::exception& ex) diff --git a/objective-c/src/Ice/ObjectI.h b/objective-c/src/Ice/ObjectI.h index 857740059e2..8b8bebf3fdc 100644 --- a/objective-c/src/Ice/ObjectI.h +++ b/objective-c/src/Ice/ObjectI.h @@ -40,5 +40,5 @@ typedef IceUtil::Handle<ServantWrapper> ServantWrapperPtr; { Ice::Object* object_; } -+(id) servantWrapperWithCxxObject:(Ice::Object*)arg; ++(id) servantWrapperWithCxxObjectNoAutoRelease:(Ice::Object*)arg; @end diff --git a/objective-c/src/Ice/Proxy.mm b/objective-c/src/Ice/Proxy.mm index 3433886cd2f..94cc127ab02 100644 --- a/objective-c/src/Ice/Proxy.mm +++ b/objective-c/src/Ice/Proxy.mm @@ -137,7 +137,6 @@ void exception(const Ice::Exception& ex) exception = [e retain]; } } - return; } } if(exception != nil) @@ -558,7 +557,7 @@ BOOL _returnsData; } @catch(id e) { - nsex = [e retain]; + nsex = e; } [is release]; } @@ -861,7 +860,7 @@ BOOL _returnsData; } @catch(id e) { - nsex = [e retain]; + nsex = e; } [is release]; } diff --git a/objective-c/src/Ice/Stream.mm b/objective-c/src/Ice/Stream.mm index 26ca3fbe8ee..cf973a4e645 100644 --- a/objective-c/src/Ice/Stream.mm +++ b/objective-c/src/Ice/Stream.mm @@ -1135,7 +1135,6 @@ private: -(void) throwException { - ICEUserException* ex = nil; NSException* nsex = nil; try { @@ -1143,12 +1142,14 @@ private: } catch(const IceObjC::ExceptionWrapper& e) { - ex = e.getException(); - @throw [ex autorelease]; // NOTE: exceptions are always auto-released, no need for the caller to do it. + nsex = [e.getException() autorelease]; // NOTE: exceptions are always auto-released, no need for the caller to do it. } catch(const std::exception& ex) { nsex = toObjCException(ex); + } + if(nsex != nil) + { @throw nsex; } } diff --git a/objective-c/src/Ice/Util.mm b/objective-c/src/Ice/Util.mm index d0e0032d4db..ed055dd7509 100644 --- a/objective-c/src/Ice/Util.mm +++ b/objective-c/src/Ice/Util.mm @@ -50,22 +50,34 @@ void completed(const Ice::AsyncResultPtr& result) { @try { + NSException* nsex = nil; try { _completed(result); } catch(const Ice::Exception& ex) { + nsex = toObjCException(ex); + } + if(nsex != nil) + { @try { - NSException* nsex = toObjCException(ex); + @throw nsex; } @catch(ICEException* e) { if(_exception) { - _exception(e); + try + { + _exception(e); + } + catch(const Ice::Exception& ex) + { + exception = [toObjCException(ex) retain]; + } } } } @@ -462,7 +474,7 @@ toObjC(const Ice::ObjectPtr& object) // Given object is an Objective-C servant wrapped into a C++ // object, return the wrapped Objective-C object. // - return [[wrapper->getServant() retain] autorelease]; + return [wrapper->getServant() retain]; } else if(Ice::NativePropertiesAdminPtr::dynamicCast(object)) { @@ -470,13 +482,13 @@ toObjC(const Ice::ObjectPtr& object) // Given object is a properties admin facet, return the // Objective-C wrapper. // - return [ICENativePropertiesAdmin servantWrapperWithCxxObject:object.get()]; + return [ICENativePropertiesAdmin servantWrapperWithCxxObjectNoAutoRelease:object.get()]; } else { // // Given object is a C++ servant, return an Objective-C wrapper. // - return [ICEServantWrapper servantWrapperWithCxxObject:object.get()]; + return [ICEServantWrapper servantWrapperWithCxxObjectNoAutoRelease:object.get()]; } } diff --git a/objective-c/test/Ice/acm/AllTests.m b/objective-c/test/Ice/acm/AllTests.m index fe58953bf1b..07ae9fffce7 100644 --- a/objective-c/test/Ice/acm/AllTests.m +++ b/objective-c/test/Ice/acm/AllTests.m @@ -358,6 +358,7 @@ { [_cond lock]; [_test run]; + _test = nil; // Break cyclic reference count _called = YES; [_cond signal]; [_cond unlock]; diff --git a/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C ARC Test Controller.xcscheme b/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C ARC Test Controller.xcscheme index 9c516f98bd4..fe59f2fe1da 100644 --- a/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C ARC Test Controller.xcscheme +++ b/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C ARC Test Controller.xcscheme @@ -65,7 +65,7 @@ </AdditionalOptions> </LaunchAction> <ProfileAction - buildConfiguration = "Release" + buildConfiguration = "Debug" shouldUseLaunchSchemeArgsEnv = "YES" savedToolIdentifier = "" useCustomWorkingDirectory = "NO" diff --git a/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C Test Controller.xcscheme b/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C Test Controller.xcscheme index 4793770807e..ff9aef8f904 100644 --- a/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C Test Controller.xcscheme +++ b/objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C Test Controller.xcscheme @@ -65,7 +65,7 @@ </AdditionalOptions> </LaunchAction> <ProfileAction - buildConfiguration = "Release" + buildConfiguration = "Debug" shouldUseLaunchSchemeArgsEnv = "YES" savedToolIdentifier = "" useCustomWorkingDirectory = "NO" |