summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/Application.cpp2
-rw-r--r--cpp/src/Ice/CommunicatorI.h6
-rw-r--r--cpp/src/Ice/Initialize.cpp56
-rw-r--r--cpp/src/Ice/LoggerAdminI.cpp3
-rw-r--r--cpp/src/Ice/Service.cpp2
5 files changed, 59 insertions, 10 deletions
diff --git a/cpp/src/Ice/Application.cpp b/cpp/src/Ice/Application.cpp
index 59a0c8d4551..3bf6f597cca 100644
--- a/cpp/src/Ice/Application.cpp
+++ b/cpp/src/Ice/Application.cpp
@@ -665,7 +665,7 @@ Ice::Application::doMain(int argc, char* argv[], const InitializationData& initD
IceUtil::getProcessStringConverter()));
}
- IceInternal::Application::_communicator = initialize(argc, argv, initData);
+ IceInternal::Application::_communicator = ICE_COMMUNICATOR_HOLDER_RELEASE(initialize(argc, argv, initData));
IceInternal::Application::_destroyed = false;
//
diff --git a/cpp/src/Ice/CommunicatorI.h b/cpp/src/Ice/CommunicatorI.h
index 277d573b04b..72245853234 100644
--- a/cpp/src/Ice/CommunicatorI.h
+++ b/cpp/src/Ice/CommunicatorI.h
@@ -112,9 +112,9 @@ private:
//
void finishSetup(int&, char*[]);
- friend ICE_API CommunicatorPtr initialize(int&, char*[], const InitializationData&, Int);
- friend ICE_API CommunicatorPtr initialize(StringSeq&, const InitializationData&, Int);
- friend ICE_API CommunicatorPtr initialize(const InitializationData&, Int);
+ friend ICE_API ICE_COMMUNICATOR_HOLDER initialize(int&, char*[], const InitializationData&, Int);
+ friend ICE_API ICE_COMMUNICATOR_HOLDER initialize(StringSeq&, const InitializationData&, Int);
+ friend ICE_API ICE_COMMUNICATOR_HOLDER initialize(const InitializationData&, Int);
friend ICE_API ::IceInternal::InstancePtr IceInternal::getInstance(const ::Ice::CommunicatorPtr&);
friend ICE_API ::IceUtil::TimerPtr IceInternal::getInstanceTimer(const ::Ice::CommunicatorPtr&);
diff --git a/cpp/src/Ice/Initialize.cpp b/cpp/src/Ice/Initialize.cpp
index 66d8db8315a..e88b339696c 100644
--- a/cpp/src/Ice/Initialize.cpp
+++ b/cpp/src/Ice/Initialize.cpp
@@ -208,7 +208,43 @@ inline void checkIceVersion(Int version)
}
-CommunicatorPtr
+#ifdef ICE_CPP11_MAPPING
+
+Ice::CommunicatorHolder::CommunicatorHolder(shared_ptr<Ice::Communicator>&& communicator) :
+ _communicator(move(communicator))
+{
+}
+
+Ice::CommunicatorHolder::~CommunicatorHolder()
+{
+ if(_communicator)
+ {
+ _communicator->destroy();
+ }
+}
+
+const shared_ptr<Ice::Communicator>&
+Ice::CommunicatorHolder::communicator() const
+{
+ return _communicator;
+}
+
+shared_ptr<Ice::Communicator>
+Ice::CommunicatorHolder::release()
+{
+ return move(_communicator);
+}
+
+const shared_ptr<Ice::Communicator>&
+Ice::CommunicatorHolder::operator->() const
+{
+ return _communicator;
+}
+#endif
+
+
+
+ICE_COMMUNICATOR_HOLDER
Ice::initialize(int& argc, char* argv[], const InitializationData& initializationData, Int version)
{
checkIceVersion(version);
@@ -218,19 +254,27 @@ Ice::initialize(int& argc, char* argv[], const InitializationData& initializatio
CommunicatorIPtr communicator = CommunicatorI::create(initData);
communicator->finishSetup(argc, argv);
+#ifdef ICE_CPP11_MAPPING
+ return CommunicatorHolder(move(communicator));
+#else
return communicator;
+#endif
}
-CommunicatorPtr
+ICE_COMMUNICATOR_HOLDER
Ice::initialize(StringSeq& args, const InitializationData& initializationData, Int version)
{
IceUtilInternal::ArgVector av(args);
- CommunicatorPtr communicator = initialize(av.argc, av.argv, initializationData, version);
+ ICE_COMMUNICATOR_HOLDER communicator = initialize(av.argc, av.argv, initializationData, version);
args = argsToStringSeq(av.argc, av.argv);
+#ifdef ICE_CPP11_MAPPING
+ return move(communicator);
+#else
return communicator;
+#endif
}
-CommunicatorPtr
+ICE_COMMUNICATOR_HOLDER
Ice::initialize(const InitializationData& initData, Int version)
{
//
@@ -243,7 +287,11 @@ Ice::initialize(const InitializationData& initData, Int version)
int argc = 0;
char* argv[] = { 0 };
communicator->finishSetup(argc, argv);
+#ifdef ICE_CPP11_MAPPING
+ return CommunicatorHolder(move(communicator));
+#else
return communicator;
+#endif
}
#ifndef ICE_CPP11_MAPPING
diff --git a/cpp/src/Ice/LoggerAdminI.cpp b/cpp/src/Ice/LoggerAdminI.cpp
index a213026fcf3..bb42febfaa7 100644
--- a/cpp/src/Ice/LoggerAdminI.cpp
+++ b/cpp/src/Ice/LoggerAdminI.cpp
@@ -313,7 +313,8 @@ createSendLogCommunicator(const CommunicatorPtr& communicator, const LoggerPtr&
}
initData.properties->parseCommandLineOptions("", extraProps);
}
- return initialize(initData);
+
+ return ICE_COMMUNICATOR_HOLDER_RELEASE(initialize(initData));
}
//
diff --git a/cpp/src/Ice/Service.cpp b/cpp/src/Ice/Service.cpp
index 3ed40a27d6c..a1fd7da71e7 100644
--- a/cpp/src/Ice/Service.cpp
+++ b/cpp/src/Ice/Service.cpp
@@ -960,7 +960,7 @@ Ice::Service::stop()
Ice::CommunicatorPtr
Ice::Service::initializeCommunicator(int& argc, char* argv[], const InitializationData& initData)
{
- return Ice::initialize(argc, argv, initData);
+ return ICE_COMMUNICATOR_HOLDER_RELEASE(Ice::initialize(argc, argv, initData));
}
void