summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Freeze/BackgroundSaveEvictorI.cpp2
-rw-r--r--cpp/src/Freeze/SharedDbEnv.cpp2
-rw-r--r--cpp/src/Glacier2/Blobject.cpp111
-rw-r--r--cpp/src/Glacier2/Blobject.h4
-rw-r--r--cpp/src/Glacier2/ClientBlobject.cpp2
-rw-r--r--cpp/src/Glacier2/Instance.cpp9
-rw-r--r--cpp/src/Glacier2/Instance.h8
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp53
-rw-r--r--cpp/src/Glacier2/RequestQueue.h11
-rw-r--r--cpp/src/Glacier2/ServerBlobject.cpp5
-rw-r--r--cpp/src/Glacier2/ServerBlobject.h4
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp2
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp2
-rw-r--r--cpp/src/Ice/EndpointI.cpp2
-rw-r--r--cpp/src/Ice/SelectorThread.cpp7
-rw-r--r--cpp/src/IceGrid/Database.cpp2
-rw-r--r--cpp/src/IceGrid/Internal.ice3
-rw-r--r--cpp/src/IceGrid/NodeCache.cpp30
-rw-r--r--cpp/src/IceGrid/ServerI.cpp11
-rw-r--r--cpp/src/IceGrid/Util.cpp11
-rw-r--r--cpp/src/IceUtil/Timer.cpp2
-rw-r--r--cpp/src/slice2cpp/Gen.cpp4
-rw-r--r--cpp/src/slice2cs/Gen.cpp4
-rw-r--r--cpp/src/slice2java/Gen.cpp4
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)