summaryrefslogtreecommitdiff
path: root/objective-c
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-07-01 15:58:55 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-07-01 15:58:55 +0200
commit96dc2ae69c8ab627e48e42354710ea12d62d70aa (patch)
tree03605e5ef10524d33e6501a89d8c26e9c4a1833e /objective-c
parentFix for ICE-8175 - IceStorm/repstress hang, run test on test driver main thread (diff)
downloadice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.tar.bz2
ice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.tar.xz
ice-96dc2ae69c8ab627e48e42354710ea12d62d70aa.zip
Fixes for ICE-8204 - Objective-C leak fixes
Diffstat (limited to 'objective-c')
-rw-r--r--objective-c/include/objc/Ice/Initialize.h6
-rw-r--r--objective-c/src/Ice/CommunicatorI.mm8
-rw-r--r--objective-c/src/Ice/Initialize.mm30
-rw-r--r--objective-c/src/Ice/Object.mm4
-rw-r--r--objective-c/src/Ice/ObjectAdapterI.mm16
-rw-r--r--objective-c/src/Ice/ObjectI.h2
-rw-r--r--objective-c/src/Ice/Proxy.mm5
-rw-r--r--objective-c/src/Ice/Stream.mm7
-rw-r--r--objective-c/src/Ice/Util.mm22
-rw-r--r--objective-c/test/Ice/acm/AllTests.m1
-rw-r--r--objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C ARC Test Controller.xcscheme2
-rw-r--r--objective-c/test/ios/controller/Objective-C Test Controller.xcodeproj/xcshareddata/xcschemes/Objective-C Test Controller.xcscheme2
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"