diff options
author | Bernard Normier <bernard@zeroc.com> | 2006-06-08 05:10:13 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2006-06-08 05:10:13 +0000 |
commit | 353add91960fa4f133bd2db69a11f7efa1ced160 (patch) | |
tree | bed068f5c9b04488ddbaa48eb9b58283232d78bf /cpp/src | |
parent | *** empty log message *** (diff) | |
download | ice-353add91960fa4f133bd2db69a11f7efa1ced160.tar.bz2 ice-353add91960fa4f133bd2db69a11f7efa1ced160.tar.xz ice-353add91960fa4f133bd2db69a11f7efa1ced160.zip |
Fix for bugs #1015 and #542 (default properties)
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2/Glacier2Router.cpp | 24 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/Initialize.cpp | 90 | ||||
-rw-r--r-- | cpp/src/Ice/PropertiesI.cpp | 22 | ||||
-rw-r--r-- | cpp/src/Ice/PropertiesI.h | 10 | ||||
-rwxr-xr-x | cpp/src/Ice/Service.cpp | 26 | ||||
-rw-r--r-- | cpp/src/IceGrid/IceGridNode.cpp | 16 | ||||
-rw-r--r-- | cpp/src/IceGrid/IceGridRegistry.cpp | 14 | ||||
-rw-r--r-- | cpp/src/IcePatch2/Server.cpp | 6 |
9 files changed, 101 insertions, 108 deletions
diff --git a/cpp/src/Glacier2/Glacier2Router.cpp b/cpp/src/Glacier2/Glacier2Router.cpp index 330761d7fc8..ccb3c85e93a 100644 --- a/cpp/src/Glacier2/Glacier2Router.cpp +++ b/cpp/src/Glacier2/Glacier2Router.cpp @@ -53,7 +53,7 @@ protected: virtual bool start(int, char*[]); virtual bool stop(); - virtual CommunicatorPtr initializeCommunicator(int&, char*[]); + virtual CommunicatorPtr initializeCommunicator(int&, char*[], const InitializationData&); private: @@ -304,26 +304,28 @@ Glacier2::RouterService::stop() } CommunicatorPtr -Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[]) +Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[], + const InitializationData& initializationData) { - PropertiesPtr defaultProperties = getDefaultProperties(argc, argv); - + InitializationData initData = initializationData; + initData.properties = createProperties(argc, argv, initializationData.properties); + // // Glacier2 always runs in thread-per-connection mode. // - defaultProperties->setProperty("Ice.ThreadPerConnection", "1"); + initData.properties->setProperty("Ice.ThreadPerConnection", "1"); // // Make sure that Glacier2 doesn't use a router. // - defaultProperties->setProperty("Ice.Default.Router", ""); + initData.properties->setProperty("Ice.Default.Router", ""); // // No active connection management is permitted with // Glacier2. Connections must remain established. // - defaultProperties->setProperty("Ice.ACM.Client", "0"); - defaultProperties->setProperty("Ice.ACM.Server", "0"); + initData.properties->setProperty("Ice.ACM.Client", "0"); + initData.properties->setProperty("Ice.ACM.Server", "0"); // // Ice.MonitorConnections defaults to the smaller of Ice.ACM.Client @@ -331,9 +333,9 @@ Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[]) // the connection monitor thread for AMI timeouts. We only set // this value if it hasn't been set explicitly already. // - if(defaultProperties->getProperty("Ice.MonitorConnections").empty()) + if(initData.properties->getProperty("Ice.MonitorConnections").empty()) { - defaultProperties->setProperty("Ice.MonitorConnections", "60"); + initData.properties->setProperty("Ice.MonitorConnections", "60"); } // @@ -344,7 +346,7 @@ Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[]) // the clients. // - return Service::initializeCommunicator(argc, argv); + return Service::initializeCommunicator(argc, argv, initData); } void diff --git a/cpp/src/Ice/CommunicatorI.h b/cpp/src/Ice/CommunicatorI.h index fe29d051696..d77c7d1066d 100644 --- a/cpp/src/Ice/CommunicatorI.h +++ b/cpp/src/Ice/CommunicatorI.h @@ -69,6 +69,7 @@ private: void finishSetup(int&, char*[]); friend ICE_API CommunicatorPtr initialize(int&, char*[], const InitializationData&, Int); + friend ICE_API CommunicatorPtr initialize(const InitializationData&, Int); friend ICE_API ::IceInternal::InstancePtr IceInternal::getInstance(const ::Ice::CommunicatorPtr&); const ::IceInternal::InstancePtr _instance; diff --git a/cpp/src/Ice/Initialize.cpp b/cpp/src/Ice/Initialize.cpp index ca108e8db85..90d37f16bc1 100644 --- a/cpp/src/Ice/Initialize.cpp +++ b/cpp/src/Ice/Initialize.cpp @@ -89,66 +89,21 @@ Ice::createProperties() } PropertiesPtr -Ice::createProperties(StringSeq& args) +Ice::createProperties(StringSeq& args, const PropertiesPtr& defaults) { - return new PropertiesI(args); + return new PropertiesI(args, defaults); } PropertiesPtr -Ice::createProperties(int& argc, char* argv[]) +Ice::createProperties(int& argc, char* argv[], const PropertiesPtr& defaults) { StringSeq args = argsToStringSeq(argc, argv); - PropertiesPtr properties = createProperties(args); + PropertiesPtr properties = createProperties(args, defaults); stringSeqToArgs(args, argc, argv); return properties; } -static PropertiesPtr defaultProperties; -class DefaultPropertiesDestroyer -{ -public: - - ~DefaultPropertiesDestroyer() - { - defaultProperties = 0; - } -}; -static DefaultPropertiesDestroyer defaultPropertiesDestroyer; -static IceUtil::StaticMutex defaultPropMutex = ICE_STATIC_MUTEX_INITIALIZER; - -PropertiesPtr -Ice::getDefaultProperties() -{ - IceUtil::StaticMutex::Lock sync(defaultPropMutex); - if(!defaultProperties) - { - defaultProperties = createProperties(); - } - return defaultProperties; -} - -PropertiesPtr -Ice::getDefaultProperties(StringSeq& args) -{ - IceUtil::StaticMutex::Lock sync(defaultPropMutex); - if(!defaultProperties) - { - defaultProperties = createProperties(args); - } - return defaultProperties; -} - -PropertiesPtr -Ice::getDefaultProperties(int& argc, char* argv[]) -{ - StringSeq args = argsToStringSeq(argc, argv); - PropertiesPtr properties = getDefaultProperties(args); - stringSeqToArgs(args, argc, argv); - return properties; -} - -CommunicatorPtr -Ice::initialize(int& argc, char* argv[], const InitializationData& initData, Int version) +inline void checkIceVersion(Int version) { #ifndef ICE_IGNORE_VERSION // @@ -167,23 +122,40 @@ Ice::initialize(int& argc, char* argv[], const InitializationData& initData, Int throw VersionMismatchException(__FILE__, __LINE__); } #endif +} - InitializationData tmpData = initData; - if(tmpData.properties == 0) - { - tmpData.properties = getDefaultProperties(argc, argv); - } - StringSeq args = argsToStringSeq(argc, argv); - args = tmpData.properties->parseIceCommandLineOptions(args); - stringSeqToArgs(args, argc, argv); - CommunicatorI* communicatorI = new CommunicatorI(tmpData); +CommunicatorPtr +Ice::initialize(int& argc, char* argv[], const InitializationData& initializationData, Int version) +{ + InitializationData initData = initializationData; + initData.properties = createProperties(argc, argv, initData.properties); + + CommunicatorI* communicatorI = new CommunicatorI(initData); CommunicatorPtr result = communicatorI; // For exception safety. communicatorI->finishSetup(argc, argv); return result; } CommunicatorPtr +Ice::initialize(const InitializationData& initData, Int version) +{ + // + // We can't simply call the other initialize() because this one does NOT read + // the config file, while the other one always does. + // + checkIceVersion(version); + + CommunicatorI* communicatorI = new CommunicatorI(initData); + CommunicatorPtr result = communicatorI; // For exception safety. + int argc = 0; + char* argv[] = { 0 }; + communicatorI->finishSetup(argc, argv); + return result; +} + + +CommunicatorPtr Ice::initializeWithProperties(int& argc, char* argv[], const PropertiesPtr& properties, Int version) { InitializationData initData; diff --git a/cpp/src/Ice/PropertiesI.cpp b/cpp/src/Ice/PropertiesI.cpp index 44e3bfb9b3e..598dd2110a5 100644 --- a/cpp/src/Ice/PropertiesI.cpp +++ b/cpp/src/Ice/PropertiesI.cpp @@ -240,11 +240,28 @@ Ice::PropertiesI::PropertiesI(const PropertiesI* p) : Ice::PropertiesI::PropertiesI() { - loadConfig(); } -Ice::PropertiesI::PropertiesI(StringSeq& args) +Ice::PropertiesI::PropertiesI(StringSeq& args, const PropertiesPtr& defaults) { + // + // Since there is no way to iterate over all Properties, we + // assume that defaults (when not null) points to a PropertiesI + // + if(defaults != 0) + { + PropertiesI* defaultsI = dynamic_cast<PropertiesI*>(defaults.get()); + if(defaultsI == 0) + { + throw InitializationException(__FILE__, __LINE__, + "Invalid Properties implementation"); + } + + IceUtil::Mutex::Lock sync(*defaultsI); + _properties = defaultsI->_properties; + } + + StringSeq::iterator q = args.begin(); if(q != args.end()) { @@ -282,6 +299,7 @@ Ice::PropertiesI::PropertiesI(StringSeq& args) args = parseIceCommandLineOptions(args); } + void Ice::PropertiesI::parseLine(const string& line) { diff --git a/cpp/src/Ice/PropertiesI.h b/cpp/src/Ice/PropertiesI.h index 603e1bc2a24..0a8a5622daa 100644 --- a/cpp/src/Ice/PropertiesI.h +++ b/cpp/src/Ice/PropertiesI.h @@ -33,14 +33,14 @@ public: virtual PropertiesPtr clone(); private: - - PropertiesI(const PropertiesI*); PropertiesI(); - PropertiesI(StringSeq&); + PropertiesI(StringSeq&, const PropertiesPtr&); + PropertiesI(const PropertiesI*); friend ICE_API PropertiesPtr createProperties(); - friend ICE_API PropertiesPtr createProperties(StringSeq&); - friend ICE_API PropertiesPtr createProperties(int&, char*[]); + friend ICE_API PropertiesPtr createProperties(StringSeq&, const PropertiesPtr&); + friend ICE_API PropertiesPtr createProperties(int&, char*[], const PropertiesPtr&); + void parseLine(const std::string&); diff --git a/cpp/src/Ice/Service.cpp b/cpp/src/Ice/Service.cpp index a54b6a369ee..8379d315813 100755 --- a/cpp/src/Ice/Service.cpp +++ b/cpp/src/Ice/Service.cpp @@ -189,7 +189,7 @@ Ice::Service::interrupt() } int -Ice::Service::main(int& argc, char* argv[]) +Ice::Service::main(int& argc, char* argv[], const InitializationData& initData) { _name = argv[0]; @@ -449,7 +449,7 @@ Ice::Service::main(int& argc, char* argv[]) } #endif - return run(argc, argv); + return run(argc, argv, initData); } Ice::CommunicatorPtr @@ -493,14 +493,14 @@ Ice::Service::checkSystem() const } int -Ice::Service::run(int& argc, char* argv[]) +Ice::Service::run(int& argc, char* argv[], const InitializationData& initData) { if(_service) { #ifdef _WIN32 - return runService(argc, argv); + return runService(argc, argv, initData); #else - return runDaemon(argc, argv); + return runDaemon(argc, argv, initData); #endif } @@ -521,7 +521,7 @@ Ice::Service::run(int& argc, char* argv[]) // // Initialize the communicator. // - _communicator = initializeCommunicator(argc, argv); + _communicator = initializeCommunicator(argc, argv, initData); // // Use the configured logger. @@ -916,9 +916,9 @@ Ice::Service::stop() } Ice::CommunicatorPtr -Ice::Service::initializeCommunicator(int& argc, char* argv[]) +Ice::Service::initializeCommunicator(int& argc, char* argv[], const InitializationData& initData) { - return Ice::initialize(argc, argv); + return Ice::initialize(argc, argv, initData); } void @@ -1045,7 +1045,7 @@ Ice::Service::disableInterrupt() #ifdef _WIN32 int -Ice::Service::runService(int argc, char* argv[]) +Ice::Service::runService(int argc, char* argv[], const InitializationData& initData) { assert(_service); @@ -1070,6 +1070,8 @@ Ice::Service::runService(int argc, char* argv[]) _serviceArgs.push_back(argv[idx]); } + _initData = initData; + SERVICE_TABLE_ENTRY ste[] = { { const_cast<char*>(_name.c_str()), Ice_Service_ServiceMain }, @@ -1271,7 +1273,7 @@ Ice::Service::serviceMain(int argc, char* argv[]) // try { - _communicator = initializeCommunicator(argc, args); + _communicator = initializeCommunicator(argc, args, _initData); } catch(const Ice::Exception& ex) { @@ -1470,7 +1472,7 @@ Ice::ServiceStatusManager::run() #else int -Ice::Service::runDaemon(int argc, char* argv[]) +Ice::Service::runDaemon(int argc, char* argv[], const InitializationData& initData) { assert(_service); @@ -1650,7 +1652,7 @@ Ice::Service::runDaemon(int argc, char* argv[]) // // Initialize the communicator. // - _communicator = initializeCommunicator(argc, argv); + _communicator = initializeCommunicator(argc, argv, initData); if(_closeFiles) { diff --git a/cpp/src/IceGrid/IceGridNode.cpp b/cpp/src/IceGrid/IceGridNode.cpp index 5cb0a8d01d0..cd1ab743ac1 100644 --- a/cpp/src/IceGrid/IceGridNode.cpp +++ b/cpp/src/IceGrid/IceGridNode.cpp @@ -111,7 +111,7 @@ protected: virtual bool start(int, char*[]); virtual void waitForShutdown(); virtual bool stop(); - virtual CommunicatorPtr initializeCommunicator(int&, char*[]); + virtual CommunicatorPtr initializeCommunicator(int&, char*[], const InitializationData&); private: @@ -653,18 +653,20 @@ NodeService::stop() } CommunicatorPtr -NodeService::initializeCommunicator(int& argc, char* argv[]) +NodeService::initializeCommunicator(int& argc, char* argv[], + const InitializationData& initializationData) { - PropertiesPtr defaultProperties = getDefaultProperties(argc, argv); - + InitializationData initData = initializationData; + initData.properties = createProperties(argc, argv, initData.properties); + // // Make sure that IceGridNode doesn't use thread-per-connection or // collocation optimization // - defaultProperties->setProperty("Ice.ThreadPerConnection", ""); - defaultProperties->setProperty("Ice.Default.CollocationOptimization", "0"); + initData.properties->setProperty("Ice.ThreadPerConnection", ""); + initData.properties->setProperty("Ice.Default.CollocationOptimization", "0"); - return Service::initializeCommunicator(argc, argv); + return Service::initializeCommunicator(argc, argv, initData); } void diff --git a/cpp/src/IceGrid/IceGridRegistry.cpp b/cpp/src/IceGrid/IceGridRegistry.cpp index a44c2faac6b..1a2478e46ea 100644 --- a/cpp/src/IceGrid/IceGridRegistry.cpp +++ b/cpp/src/IceGrid/IceGridRegistry.cpp @@ -29,7 +29,7 @@ protected: virtual bool start(int, char*[]); virtual bool stop(); - virtual CommunicatorPtr initializeCommunicator(int&, char*[]); + virtual CommunicatorPtr initializeCommunicator(int&, char*[], const InitializationData&); private: @@ -111,18 +111,20 @@ RegistryService::stop() } CommunicatorPtr -RegistryService::initializeCommunicator(int& argc, char* argv[]) +RegistryService::initializeCommunicator(int& argc, char* argv[], + const InitializationData& initializationData) { - PropertiesPtr defaultProperties = getDefaultProperties(argc, argv); + InitializationData initData = initializationData; + initData.properties = createProperties(argc, argv, initData.properties); // // Make sure that IceGridRegistry doesn't use // thread-per-connection or collocation optimization. // - defaultProperties->setProperty("Ice.ThreadPerConnection", ""); - defaultProperties->setProperty("Ice.Default.CollocationOptimization", "0"); + initData.properties->setProperty("Ice.ThreadPerConnection", ""); + initData.properties->setProperty("Ice.Default.CollocationOptimization", "0"); - return Service::initializeCommunicator(argc, argv); + return Service::initializeCommunicator(argc, argv, initData); } void diff --git a/cpp/src/IcePatch2/Server.cpp b/cpp/src/IcePatch2/Server.cpp index 1d12361a309..efe193805cf 100644 --- a/cpp/src/IcePatch2/Server.cpp +++ b/cpp/src/IcePatch2/Server.cpp @@ -50,7 +50,6 @@ protected: virtual bool start(int, char*[]); virtual bool stop(); - virtual CommunicatorPtr initializeCommunicator(int&, char*[]); private: @@ -196,11 +195,6 @@ IcePatch2::PatcherService::stop() return true; } -CommunicatorPtr -IcePatch2::PatcherService::initializeCommunicator(int& argc, char* argv[]) -{ - return Service::initializeCommunicator(argc, argv); -} void IcePatch2::PatcherService::usage(const string& appName) |