diff options
Diffstat (limited to 'cpp/src')
24 files changed, 218 insertions, 77 deletions
diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp index b4b318b2ce6..db422db3415 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp @@ -198,7 +198,9 @@ Freeze::BackgroundSaveEvictorI::BackgroundSaveEvictorI(const ObjectAdapterPtr& a // // Start saving thread // + __setNoDelete(true); start(); + __setNoDelete(false); } diff --git a/cpp/src/Freeze/SharedDbEnv.cpp b/cpp/src/Freeze/SharedDbEnv.cpp index 620a17459b9..1455d9aa613 100644 --- a/cpp/src/Freeze/SharedDbEnv.cpp +++ b/cpp/src/Freeze/SharedDbEnv.cpp @@ -604,7 +604,9 @@ Freeze::CheckpointThread::CheckpointThread(SharedDbEnv& dbEnv, const Time& check _kbyte(kbyte), _trace(trace) { + __setNoDelete(true); start(); + __setNoDelete(false); } void diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp index e20b82326aa..10d2849604a 100644 --- a/cpp/src/Glacier2/Blobject.cpp +++ b/cpp/src/Glacier2/Blobject.cpp @@ -8,6 +8,7 @@ // ********************************************************************** #include <Glacier2/Blobject.h> +#include <Glacier2/SessionRouterI.h> using namespace std; using namespace Ice; @@ -29,8 +30,12 @@ class AMI_Array_Object_ice_invokeTwowayI : public AMI_Array_Object_ice_invoke { public: - AMI_Array_Object_ice_invokeTwowayI(const AMD_Array_Object_ice_invokePtr& amdCB) : - _amdCB(amdCB) + AMI_Array_Object_ice_invokeTwowayI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -43,20 +48,50 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + _amdCB->ice_exception(ex); } private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; class AMI_Array_Object_ice_invokeOnewayI : public AMI_Array_Object_ice_invoke, public Ice::AMISentCallback { public: - AMI_Array_Object_ice_invokeOnewayI(const AMD_Array_Object_ice_invokePtr& amdCB) : - _amdCB(amdCB) + AMI_Array_Object_ice_invokeOnewayI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -75,44 +110,65 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + _amdCB->ice_exception(ex); } private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; } -Glacier2::Blobject::Blobject(const InstancePtr& instance, bool reverse, const Ice::Context& sslContext) : +Glacier2::Blobject::Blobject(const InstancePtr& instance, const ConnectionPtr& reverseConnection, + const Ice::Context& sslContext) : _instance(instance), - _reverse(reverse), - _forwardContext(_reverse ? + _reverseConnection(reverseConnection), + _forwardContext(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverForwardContext) > 0 : _instance->properties()->getPropertyAsInt(clientForwardContext) > 0), - _alwaysBatch(_reverse ? + _alwaysBatch(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverAlwaysBatch) > 0 : _instance->properties()->getPropertyAsInt(clientAlwaysBatch) > 0), - _requestTraceLevel(_reverse ? + _requestTraceLevel(_reverseConnection ? _instance->properties()->getPropertyAsInt(serverTraceRequest) : _instance->properties()->getPropertyAsInt(clientTraceRequest)), - _overrideTraceLevel(reverse ? + _overrideTraceLevel(reverseConnection ? _instance->properties()->getPropertyAsInt(serverTraceOverride) : _instance->properties()->getPropertyAsInt(clientTraceOverride)), _sslContext(sslContext) { - RequestQueueThreadPtr t = _reverse ? _instance->serverRequestQueueThread() : _instance->clientRequestQueueThread(); + RequestQueueThreadPtr t = _reverseConnection ? _instance->serverRequestQueueThread() : + _instance->clientRequestQueueThread(); if(t) { - if(reverse) - { - const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t); - } - else - { - const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t); - } + const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t, _instance); } } @@ -246,7 +302,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt if(_requestTraceLevel >= 1) { Trace out(_instance->logger(), "Glacier2"); - if(_reverse) + if(_reverseConnection) { out << "reverse "; } @@ -259,7 +315,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt { out << " (not buffered)"; } - if(_reverse) + if(_reverseConnection) { out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity()); } @@ -291,8 +347,8 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt bool override; try { - override = - _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, _sslContext, amdCB)); + override = _requestQueue->addRequest( + new Request(proxy, inParams, current, _forwardContext, _sslContext, amdCB, _reverseConnection)); } catch(const ObjectNotExistException& ex) { @@ -303,12 +359,12 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt if(override && _overrideTraceLevel >= 1) { Trace out(_instance->logger(), "Glacier2"); - if(_reverse) + if(_reverseConnection) { out << "reverse "; } out << "routing override"; - if(_reverse) + if(_reverseConnection) { out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity()); } @@ -343,11 +399,12 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt Ice::AMISentCallback* sentCB = 0; if(proxy->ice_isTwoway()) { - amiCB = new AMI_Array_Object_ice_invokeTwowayI(amdCB); + amiCB = new AMI_Array_Object_ice_invokeTwowayI(amdCB, _instance, _reverseConnection); } else { - AMI_Array_Object_ice_invokeOnewayI* cb = new AMI_Array_Object_ice_invokeOnewayI(amdCB); + AMI_Array_Object_ice_invokeOnewayI* cb = + new AMI_Array_Object_ice_invokeOnewayI(amdCB, _instance, _reverseConnection); amiCB = cb; sentCB = cb; } diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h index d4f9d1c5b47..17866dd79f5 100644 --- a/cpp/src/Glacier2/Blobject.h +++ b/cpp/src/Glacier2/Blobject.h @@ -21,7 +21,7 @@ class Blobject : public Ice::BlobjectArrayAsync { public: - Blobject(const InstancePtr&, bool, const Ice::Context&); + Blobject(const InstancePtr&, const Ice::ConnectionPtr&, const Ice::Context&); virtual ~Blobject(); protected: @@ -30,10 +30,10 @@ protected: const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); const InstancePtr _instance; + const Ice::ConnectionPtr _reverseConnection; private: - const bool _reverse; const bool _forwardContext; const bool _alwaysBatch; const int _requestTraceLevel; diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp index 39887bcd0d4..5b7a14828cf 100644 --- a/cpp/src/Glacier2/ClientBlobject.cpp +++ b/cpp/src/Glacier2/ClientBlobject.cpp @@ -20,7 +20,7 @@ Glacier2::ClientBlobject::ClientBlobject(const InstancePtr& instance, const FilterManagerPtr& filters, const Ice::Context& sslContext): - Glacier2::Blobject(instance, false, sslContext), + Glacier2::Blobject(instance, 0, sslContext), _routingTable(new RoutingTable(_instance->communicator(), _instance->proxyVerifier())), _filters(filters), _rejectTraceLevel(_instance->properties()->getPropertyAsInt("Glacier2.Client.Trace.Reject")) diff --git a/cpp/src/Glacier2/Instance.cpp b/cpp/src/Glacier2/Instance.cpp index e2c59f0224d..f0363b64bfa 100644 --- a/cpp/src/Glacier2/Instance.cpp +++ b/cpp/src/Glacier2/Instance.cpp @@ -7,6 +7,7 @@ // // ********************************************************************** +#include <Glacier2/SessionRouterI.h> #include <Glacier2/Instance.h> using namespace std; @@ -58,4 +59,12 @@ Glacier2::Instance::destroy() { _serverRequestQueueThread->destroy(); } + + const_cast<SessionRouterIPtr&>(_sessionRouter) = 0; +} + +void +Glacier2::Instance::setSessionRouter(const SessionRouterIPtr& sessionRouter) +{ + const_cast<SessionRouterIPtr&>(_sessionRouter) = sessionRouter; } diff --git a/cpp/src/Glacier2/Instance.h b/cpp/src/Glacier2/Instance.h index b7b05ffc2cf..77410ff0c58 100644 --- a/cpp/src/Glacier2/Instance.h +++ b/cpp/src/Glacier2/Instance.h @@ -21,6 +21,9 @@ namespace Glacier2 { +class SessionRouterI; +typedef IceUtil::Handle<SessionRouterI> SessionRouterIPtr; + class Instance : public IceUtil::Shared { public: @@ -41,11 +44,15 @@ public: const RequestQueueThreadPtr& clientRequestQueueThread() const { return _clientRequestQueueThread; } const RequestQueueThreadPtr& serverRequestQueueThread() const { return _serverRequestQueueThread; } const ProxyVerifierPtr& proxyVerifier() const { return _proxyVerifier; } + const SessionRouterIPtr& sessionRouter() const { return _sessionRouter; } void destroy(); private: + friend class SessionRouterI; + void setSessionRouter(const SessionRouterIPtr&); + const Ice::CommunicatorPtr _communicator; const Ice::PropertiesPtr _properties; const Ice::LoggerPtr _logger; @@ -54,6 +61,7 @@ private: const RequestQueueThreadPtr _clientRequestQueueThread; const RequestQueueThreadPtr _serverRequestQueueThread; const ProxyVerifierPtr _proxyVerifier; + const SessionRouterIPtr _sessionRouter; }; typedef IceUtil::Handle<Instance> InstancePtr; diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index f1c7667f596..16eb5b6c9d2 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -8,6 +8,7 @@ // ********************************************************************** #include <Glacier2/RequestQueue.h> +#include <Glacier2/SessionRouterI.h> #include <set> using namespace std; @@ -24,7 +25,12 @@ class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke { public: - AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB) : _amdCB(amdCB) + AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB, + const InstancePtr& instance, + const ConnectionPtr& connection) : + _amdCB(amdCB), + _instance(instance), + _connection(connection) { } @@ -40,6 +46,30 @@ public: virtual void ice_exception(const Exception& ex) { + // + // If the connection has been lost, destroy the session. + // + if(_connection) + { + try + { + ex.ice_throw(); + } + catch(const Ice::ConnectionLostException&) + { + try + { + _instance->sessionRouter()->destroySession(_connection); + } + catch(const Exception&) + { + } + } + catch(const Exception&) + { + } + } + if(_amdCB) { _amdCB->ice_exception(ex); @@ -49,19 +79,22 @@ public: private: const AMD_Array_Object_ice_invokePtr _amdCB; + const InstancePtr _instance; + const ConnectionPtr _connection; }; } Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams, const Current& current, bool forwardContext, const Ice::Context& sslContext, - const AMD_Array_Object_ice_invokePtr& amdCB) : + const AMD_Array_Object_ice_invokePtr& amdCB, const ConnectionPtr& connection) : _proxy(proxy), _inParams(inParams.first, inParams.second), _current(current), _forwardContext(forwardContext), _sslContext(sslContext), - _amdCB(amdCB) + _amdCB(amdCB), + _connection(connection) { // // If this is not a twoway call, we can finish the AMD call right @@ -81,7 +114,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, bool -Glacier2::Request::invoke() +Glacier2::Request::invoke(const InstancePtr& instance) { pair<const Byte*, const Byte*> inPair; if(_inParams.size() == 0) @@ -128,11 +161,11 @@ Glacier2::Request::invoke() AMI_Array_Object_ice_invokePtr amiCB; if(_proxy->ice_isTwoway()) { - amiCB = new AMI_Array_Object_ice_invokeI(_amdCB); + amiCB = new AMI_Array_Object_ice_invokeI(_amdCB, instance, _connection); } else { - amiCB = new AMI_Array_Object_ice_invokeI(0); + amiCB = new AMI_Array_Object_ice_invokeI(0, instance, _connection); } if(_forwardContext) @@ -194,8 +227,10 @@ Glacier2::Request::override(const RequestPtr& other) const return _override == other->_override; } -Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread) : - _requestQueueThread(requestQueueThread) +Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread, + const InstancePtr& instance) : + _requestQueueThread(requestQueueThread), + _instance(instance) { } @@ -238,7 +273,7 @@ Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies) { try { - if((*p)->invoke()) // If batch invocation, add the proxy to the batch proxy set. + if((*p)->invoke(_instance)) // If batch invocation, add the proxy to the batch proxy set. { batchProxies.insert((*p)->getProxy()); } diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h index e91aa46e48b..3578511c5aa 100644 --- a/cpp/src/Glacier2/RequestQueue.h +++ b/cpp/src/Glacier2/RequestQueue.h @@ -17,6 +17,9 @@ namespace Glacier2 { +class Instance; +typedef IceUtil::Handle<Instance> InstancePtr; + class Request; typedef IceUtil::Handle<Request> RequestPtr; @@ -28,9 +31,9 @@ class Request : public IceUtil::Shared public: Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool, - const Ice::Context&, const Ice::AMD_Array_Object_ice_invokePtr&); + const Ice::Context&, const Ice::AMD_Array_Object_ice_invokePtr&, const Ice::ConnectionPtr&); - bool invoke(); + bool invoke(const InstancePtr&); bool override(const RequestPtr&) const; const Ice::ObjectPrx& getProxy() const { return _proxy; } bool hasOverride() const { return !_override.empty(); } @@ -44,13 +47,14 @@ private: const Ice::Context _sslContext; const std::string _override; const Ice::AMD_Array_Object_ice_invokePtr _amdCB; + const Ice::ConnectionPtr _connection; }; class RequestQueue : public IceUtil::Mutex, public IceUtil::Shared { public: - RequestQueue(const RequestQueueThreadPtr&); + RequestQueue(const RequestQueueThreadPtr&, const InstancePtr&); bool addRequest(const RequestPtr&); void flushRequests(std::set<Ice::ObjectPrx>&); @@ -58,6 +62,7 @@ public: private: const RequestQueueThreadPtr _requestQueueThread; + const InstancePtr _instance; std::vector<RequestPtr> _requests; }; typedef IceUtil::Handle<RequestQueue> RequestQueuePtr; diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp index f528f25ecc9..628373163ce 100644 --- a/cpp/src/Glacier2/ServerBlobject.cpp +++ b/cpp/src/Glacier2/ServerBlobject.cpp @@ -14,8 +14,7 @@ using namespace Ice; using namespace Glacier2; Glacier2::ServerBlobject::ServerBlobject(const InstancePtr& instance, const ConnectionPtr& connection) : - Glacier2::Blobject(instance, true, Ice::Context()), - _connection(connection) + Glacier2::Blobject(instance, connection, Ice::Context()) { } @@ -28,7 +27,7 @@ Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { - ObjectPrx proxy = _connection->createProxy(current.id); + ObjectPrx proxy = _reverseConnection->createProxy(current.id); assert(proxy); invoke(proxy, amdCB, inParams, current); diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h index e4a7868315c..5b94461a299 100644 --- a/cpp/src/Glacier2/ServerBlobject.h +++ b/cpp/src/Glacier2/ServerBlobject.h @@ -27,10 +27,6 @@ public: virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); - -private: - - const Ice::ConnectionPtr _connection; }; } diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 68587d74a8c..8ab1ada68df 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -677,6 +677,8 @@ Glacier2::SessionRouterI::SessionRouterI(const InstancePtr& instance, { _sessionThread->start(); } + + _instance->setSessionRouter(this); } Glacier2::SessionRouterI::~SessionRouterI() diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp index c84ff797b7f..23fd5bcb242 100644 --- a/cpp/src/Ice/ConnectionFactory.cpp +++ b/cpp/src/Ice/ConnectionFactory.cpp @@ -1495,7 +1495,7 @@ IceInternal::IncomingConnectionFactory::initialize(const string& adapterName) { // Here we ignore any exceptions in close(). } - + _acceptor = 0; throw; } } diff --git a/cpp/src/Ice/EndpointI.cpp b/cpp/src/Ice/EndpointI.cpp index a9e3832de70..455131d169b 100644 --- a/cpp/src/Ice/EndpointI.cpp +++ b/cpp/src/Ice/EndpointI.cpp @@ -33,7 +33,9 @@ IceInternal::EndpointHostResolver::EndpointHostResolver(const InstancePtr& insta _instance(instance), _destroyed(false) { + __setNoDelete(false); start(); + __setNoDelete(true); } void diff --git a/cpp/src/Ice/SelectorThread.cpp b/cpp/src/Ice/SelectorThread.cpp index c76505c240e..4b45bff6c03 100644 --- a/cpp/src/Ice/SelectorThread.cpp +++ b/cpp/src/Ice/SelectorThread.cpp @@ -25,7 +25,6 @@ IceInternal::SelectorThread::SelectorThread(const InstancePtr& instance) : _selector(instance), _timer(_instance->timer()) { - __setNoDelete(true); try { @@ -38,11 +37,17 @@ IceInternal::SelectorThread::SelectorThread(const InstancePtr& instance) : Error out(_instance->initializationData().logger); out << "cannot create thread for selector thread:\n" << ex; } + _thread = 0; __setNoDelete(false); throw; } catch(...) { + { + Error out(_instance->initializationData().logger); + out << "cannot create thread for selector thread"; + } + _thread = 0; __setNoDelete(false); throw; } diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index 5e5ff949aef..b2d91a0b61d 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -395,7 +395,7 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS Lock sync(*this); checkSessionLock(session); - while(_updating.find(update.descriptor.name) != _updating.end()) + while(_updating.find(newDesc.name) != _updating.end()) { wait(); } diff --git a/cpp/src/IceGrid/Internal.ice b/cpp/src/IceGrid/Internal.ice index ef3d4ab8725..48419c3f531 100644 --- a/cpp/src/IceGrid/Internal.ice +++ b/cpp/src/IceGrid/Internal.ice @@ -69,9 +69,6 @@ class InternalServerDescriptor /** The application revision. */ int revision; - /** The Ice version. */ - int iceVersion; - /** The id of the session which allocated the server. */ string sessionId; diff --git a/cpp/src/IceGrid/NodeCache.cpp b/cpp/src/IceGrid/NodeCache.cpp index 01e308fed58..b3c3f1e4365 100644 --- a/cpp/src/IceGrid/NodeCache.cpp +++ b/cpp/src/IceGrid/NodeCache.cpp @@ -898,14 +898,14 @@ NodeEntry::getInternalServerDescriptor(const ServerInfo& info) const // // For newer versions of Ice, we generate Ice.Admin properties: // - server->iceVersion = 0; + int iceVersion = 0; if(info.descriptor->iceVersion != "") { - server->iceVersion = getMMVersion(info.descriptor->iceVersion); + iceVersion = getMMVersion(info.descriptor->iceVersion); } server->processRegistered = false; - if(server->iceVersion == 0 || server->iceVersion >= 30300) + if(iceVersion == 0 || iceVersion >= 30300) { props.push_back(createProperty("Ice.Admin.ServerId", info.descriptor->id)); if(hasProperty(info.descriptor->propertySet.properties, "Ice.Admin.Endpoints")) @@ -949,7 +949,7 @@ NodeEntry::getInternalServerDescriptor(const ServerInfo& info) const } props.push_back(createProperty("IceBox.LoadOrder", servicesStr)); - if(server->iceVersion != 0 && server->iceVersion < 30300) + if(iceVersion != 0 && iceVersion < 30300) { if(hasProperty(iceBox->propertySet.properties, "IceBox.ServiceManager.RegisterProcess")) { @@ -975,7 +975,27 @@ NodeEntry::getInternalServerDescriptor(const ServerInfo& info) const // logs, adapters, db envs and properties to the internal server // descriptor. // - forEachCommunicator(ToInternalServerDescriptor(server, _session->getInfo(), server->iceVersion))(info.descriptor); + forEachCommunicator(ToInternalServerDescriptor(server, _session->getInfo(), iceVersion))(info.descriptor); + + // + // For Ice servers > 3.3.0 escape the properties. + // + if(iceVersion == 0 || iceVersion >= 30300) + { + PropertyDescriptorSeq newProps; + for(PropertyDescriptorSeq::const_iterator p = props.begin(); p != props.end(); ++p) + { + if(p->value.empty() && p->name.find('#') == 0) + { + newProps.push_back(createProperty(p->name)); + } + else + { + newProps.push_back(createProperty(escapeProperty(p->name), escapeProperty(p->value))); + } + } + server->properties["config"] = newProps; + } return server; } diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp index 1ebd9e84ba3..0d26abdfbb8 100644 --- a/cpp/src/IceGrid/ServerI.cpp +++ b/cpp/src/IceGrid/ServerI.cpp @@ -2131,8 +2131,6 @@ ServerI::updateImpl(const InternalServerDescriptorPtr& descriptor) // We do not want to esapce the properties if the Ice version is // previous to Ice 3.3. // - bool escapeProperties = (_desc->iceVersion == 0 || _desc->iceVersion > 30300); - Ice::StringSeq knownFiles; for(PropertyDescriptorSeqDict::const_iterator p = properties.begin(); p != properties.end(); ++p) { @@ -2153,14 +2151,7 @@ ServerI::updateImpl(const InternalServerDescriptorPtr& descriptor) } else { - if(escapeProperties) - { - configfile << escapeProperty(r->name) << "=" << escapeProperty(r->value) << endl; - } - else - { - configfile << r->name << "=" << r->value << endl; - } + configfile << r->name << "=" << r->value << endl; } } configfile.close(); diff --git a/cpp/src/IceGrid/Util.cpp b/cpp/src/IceGrid/Util.cpp index d3b6b998738..704f093f24a 100644 --- a/cpp/src/IceGrid/Util.cpp +++ b/cpp/src/IceGrid/Util.cpp @@ -100,14 +100,23 @@ IceGrid::createProperty(const string& name, const string& value) string IceGrid::escapeProperty(const string& s) { + size_t firstChar = s.find_first_not_of(' '); + size_t lastChar = s.find_last_not_of(' '); string result; for(unsigned int i = 0; i < s.size(); ++i) { char c = s[i]; switch(c) { - case '\\': case ' ': + if(i < firstChar || i > lastChar) + { + result.push_back('\\'); + } + result.push_back(c); + break; + + case '\\': case '#': case '=': result.push_back('\\'); diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp index a5b2175c425..c76ea8245e8 100644 --- a/cpp/src/IceUtil/Timer.cpp +++ b/cpp/src/IceUtil/Timer.cpp @@ -15,7 +15,9 @@ using namespace IceUtil; Timer::Timer() : _destroyed(false) { + __setNoDelete(false); start(); + __setNoDelete(true); } void diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index f45b93aaf07..cb3999f791b 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -2720,7 +2720,7 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p) } } - if(p->returnsData()) + if(ret || !outParams.empty()) { C << nl << "::IceInternal::BasicStream* __is = __og.is();"; C << nl << "__is->startReadEncaps();"; @@ -5357,7 +5357,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) C << nl << "return;"; C << eb; - if(p->returnsData()) + if(ret || !outParams.empty()) { C << nl << "__is->startReadEncaps();"; writeUnmarshalCode(C, outParams, 0, StringList(), true); diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp index a3a02ab55c9..77736cad662 100644 --- a/cpp/src/slice2cs/Gen.cpp +++ b/cpp/src/slice2cs/Gen.cpp @@ -4024,7 +4024,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p) _out << nl << "throw new Ice.UnknownUserException(ex.ice_name(), ex);"; _out << eb; _out << eb; - if(op->returnsData()) + if(ret || !outParams.empty()) { _out << nl << "IceInternal.BasicStream is__ = og__.istr();"; _out << nl << "is__.startReadEncaps();"; @@ -4624,7 +4624,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) _out << eb; _out << "return;"; _out << eb; - if(p->returnsData()) + if(ret || !outParams.empty()) { _out << nl << "is__.startReadEncaps();"; for(q = outParams.begin(); q != outParams.end(); ++q) diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index e8f7145afc3..6ced7eec620 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -4270,7 +4270,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p) out << nl << "throw new Ice.UnknownUserException(__ex.ice_name());"; out << eb; out << eb; - if(op->returnsData()) + if(ret || !outParams.empty()) { out << nl << "IceInternal.BasicStream __is = __og.is();"; out << nl << "__is.startReadEncaps();"; @@ -5150,7 +5150,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) out << nl << "throw new Ice.UnknownUserException(__ex.ice_name());"; out << eb; out << eb; - if(p->returnsData()) + if(ret || !outParams.empty()) { out << nl << "__is.startReadEncaps();"; for(pli = outParams.begin(); pli != outParams.end(); ++pli) |