summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2006-06-08 05:10:13 +0000
committerBernard Normier <bernard@zeroc.com>2006-06-08 05:10:13 +0000
commit353add91960fa4f133bd2db69a11f7efa1ced160 (patch)
treebed068f5c9b04488ddbaa48eb9b58283232d78bf /cpp/src
parent*** empty log message *** (diff)
downloadice-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.cpp24
-rw-r--r--cpp/src/Ice/CommunicatorI.h1
-rw-r--r--cpp/src/Ice/Initialize.cpp90
-rw-r--r--cpp/src/Ice/PropertiesI.cpp22
-rw-r--r--cpp/src/Ice/PropertiesI.h10
-rwxr-xr-xcpp/src/Ice/Service.cpp26
-rw-r--r--cpp/src/IceGrid/IceGridNode.cpp16
-rw-r--r--cpp/src/IceGrid/IceGridRegistry.cpp14
-rw-r--r--cpp/src/IcePatch2/Server.cpp6
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)