diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Application.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.h | 6 | ||||
-rw-r--r-- | cpp/src/Ice/Initialize.cpp | 56 | ||||
-rw-r--r-- | cpp/src/Ice/LoggerAdminI.cpp | 3 | ||||
-rw-r--r-- | cpp/src/Ice/Service.cpp | 2 |
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 |