diff options
-rw-r--r-- | cpp/src/Glacier2/Blobject.cpp | 26 | ||||
-rw-r--r-- | cpp/src/Glacier2/Blobject.h | 4 | ||||
-rw-r--r-- | cpp/src/Glacier2/ClientBlobject.cpp | 46 | ||||
-rw-r--r-- | cpp/src/Glacier2/ClientBlobject.h | 8 | ||||
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.cpp | 5 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 24 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.h | 3 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.cpp | 20 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.h | 4 |
9 files changed, 44 insertions, 96 deletions
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp index b4f1e44ae25..9fb116909da 100644 --- a/cpp/src/Glacier2/Blobject.cpp +++ b/cpp/src/Glacier2/Blobject.cpp @@ -55,7 +55,7 @@ Glacier2::Blobject::Blobject(const CommunicatorPtr& communicator, bool reverse) IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(serverSleepTime)) : IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(clientSleepTime)); - _requestQueue = new RequestQueue(sleepTime); + const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(sleepTime); Int threadStackSize = _properties->getPropertyAsInt("Ice.ThreadPerConnection.StackSize"); @@ -74,11 +74,7 @@ Glacier2::Blobject::Blobject(const CommunicatorPtr& communicator, bool reverse) out << "cannot create thread for request queue:\n" << ex; } - if(_requestQueue) - { - _requestQueue->destroy(); - _requestQueue = 0; - } + _requestQueue->destroy(); throw; } @@ -87,17 +83,12 @@ Glacier2::Blobject::Blobject(const CommunicatorPtr& communicator, bool reverse) Glacier2::Blobject::~Blobject() { - assert(!_requestQueue); } void Glacier2::Blobject::destroy() { - if(_requestQueue) - { - _requestQueue->destroy(); - _requestQueue = 0; - } + _requestQueue->destroy(); } void @@ -268,7 +259,16 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt // AMI. // - bool override = _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, amdCB)); + bool override; + try + { + override = _requestQueue->addRequest(new Request(proxy, inParams, current, _forwardContext, amdCB)); + } + catch(const ObjectNotExistException& ex) + { + amdCB->ice_exception(ex); + return; + } if(override && _overrideTraceLevel >= 1) { diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h index ed73d4f28bd..dca6210df05 100644 --- a/cpp/src/Glacier2/Blobject.h +++ b/cpp/src/Glacier2/Blobject.h @@ -16,7 +16,7 @@ namespace Glacier2 { -class Blobject : public Ice::BlobjectArrayAsync, public IceUtil::Mutex +class Blobject : public Ice::BlobjectArrayAsync { public: @@ -42,7 +42,7 @@ private: const bool _alwaysBatch; const int _requestTraceLevel; const int _overrideTraceLevel; - RequestQueuePtr _requestQueue; + const RequestQueuePtr _requestQueue; }; } diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp index 85e0139e90a..6f91d3cd4cf 100644 --- a/cpp/src/Glacier2/ClientBlobject.cpp +++ b/cpp/src/Glacier2/ClientBlobject.cpp @@ -20,24 +20,12 @@ Glacier2::ClientBlobject::ClientBlobject(const CommunicatorPtr& communicator, Glacier2::Blobject(communicator, false), _routingTable(routingTable), _allowCategories(allowCategories), - _rejectTraceLevel(_properties->getPropertyAsInt("Glacier2.Client.Trace.Reject")), - _timestamp(IceUtil::Time::now()) + _rejectTraceLevel(_properties->getPropertyAsInt("Glacier2.Client.Trace.Reject")) { } Glacier2::ClientBlobject::~ClientBlobject() { - assert(!_routingTable); -} - -void -Glacier2::ClientBlobject::destroy() -{ - IceUtil::Mutex::Lock lock(*this); - - assert(_routingTable); // Destroyed? - _routingTable = 0; - Blobject::destroy(); } void @@ -45,15 +33,6 @@ Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { - IceUtil::Mutex::Lock lock(*this); - - if(!_routingTable) // Destroyed? - { - ObjectNotExistException ex(__FILE__, __LINE__); - ex.id = current.id; - throw ex; - } - // // If there is an _allowCategories set then enforce it. // @@ -93,26 +72,3 @@ Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok invoke(proxy, amdCB, inParams, current); } - -IceUtil::Time -Glacier2::ClientBlobject::getTimestamp() const -{ - IceUtil::Mutex::TryLock lock(*this); - - if(lock.acquired()) - { - return _timestamp; - } - else - { - return IceUtil::Time::now(); - } -} - -void -Glacier2::ClientBlobject::updateTimestamp() -{ - IceUtil::Mutex::Lock lock(*this); - - _timestamp = IceUtil::Time::now(); -} diff --git a/cpp/src/Glacier2/ClientBlobject.h b/cpp/src/Glacier2/ClientBlobject.h index e6ea3d268c6..115b1dd08eb 100644 --- a/cpp/src/Glacier2/ClientBlobject.h +++ b/cpp/src/Glacier2/ClientBlobject.h @@ -26,20 +26,14 @@ public: ClientBlobject(const Ice::CommunicatorPtr&, const RoutingTablePtr&, const Ice::StringSeq&); virtual ~ClientBlobject(); - virtual void destroy(); - virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); - IceUtil::Time getTimestamp() const; - void updateTimestamp(); - private: - RoutingTablePtr _routingTable; + const RoutingTablePtr _routingTable; const std::vector<std::string> _allowCategories; const int _rejectTraceLevel; - mutable IceUtil::Time _timestamp; }; } diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index 1b2cc9c005b..7e37ad0ce1f 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -252,7 +252,10 @@ Glacier2::RequestQueue::addRequest(const RequestPtr& request) { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - assert(!_destroy); + if(_destroy) + { + throw ObjectNotExistException(__FILE__, __LINE__); + } for(vector<RequestPtr>::iterator p = _requests.begin(); p != _requests.end(); ++p) { diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index 1548617cb60..a075b20ac75 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -26,7 +26,8 @@ Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAd _connection(connection), _userId(userId), _session(session), - _controlId(controlId) + _controlId(controlId), + _timestamp(IceUtil::Time::now()) { string allow = _communicator->getProperties()->getProperty("Glacier2.AllowCategories"); StringSeq allowCategories; @@ -143,7 +144,10 @@ Glacier2::RouterI::addProxy(const ObjectPrx& proxy, const Current& current) ObjectProxySeq Glacier2::RouterI::addProxies(const ObjectProxySeq& proxies, const Current& current) { - _clientBlobject->updateTimestamp(); + IceUtil::Mutex::Lock lock(*this); + + _timestamp = IceUtil::Time::now(); + return _routingTable->add(proxies, current); } @@ -170,7 +174,10 @@ Glacier2::RouterI::destroySession(const Current&) ClientBlobjectPtr Glacier2::RouterI::getClientBlobject() const { - _clientBlobject->updateTimestamp(); + IceUtil::Mutex::Lock lock(*this); + + _timestamp = IceUtil::Time::now(); + return _clientBlobject; } @@ -194,7 +201,16 @@ Glacier2::RouterI::getSession() const IceUtil::Time Glacier2::RouterI::getTimestamp() const { - return _clientBlobject->getTimestamp(); + IceUtil::Mutex::TryLock lock(*this); + + if(lock.acquired()) + { + return _timestamp; + } + else + { + return IceUtil::Time::now(); + } } string diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h index 053cce85481..80b5f160cc0 100644 --- a/cpp/src/Glacier2/RouterI.h +++ b/cpp/src/Glacier2/RouterI.h @@ -22,7 +22,7 @@ namespace Glacier2 class RouterI; typedef IceUtil::Handle<RouterI> RouterIPtr; -class RouterI : public Router +class RouterI : public Router, public IceUtil::Mutex { public: @@ -61,6 +61,7 @@ private: const std::string _userId; const SessionPrx _session; const Ice::Identity _controlId; + mutable IceUtil::Time _timestamp; }; } diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp index 5c654f52132..b1fa27ee4fb 100644 --- a/cpp/src/Glacier2/ServerBlobject.cpp +++ b/cpp/src/Glacier2/ServerBlobject.cpp @@ -21,17 +21,6 @@ Glacier2::ServerBlobject::ServerBlobject(const CommunicatorPtr& communicator, co Glacier2::ServerBlobject::~ServerBlobject() { - assert(!_connection); -} - -void -Glacier2::ServerBlobject::destroy() -{ - IceUtil::Mutex::Lock lock(*this); - - assert(_connection); // Destroyed? - _connection = 0; - Blobject::destroy(); } void @@ -39,15 +28,6 @@ Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { - IceUtil::Mutex::Lock lock(*this); - - if(!_connection) // Destroyed? - { - ObjectNotExistException ex(__FILE__, __LINE__); - ex.id = current.id; - throw ex; - } - ObjectPrx proxy = _connection->createProxy(current.id); assert(proxy); diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h index 9f6fe6b656a..b4a6aa711ea 100644 --- a/cpp/src/Glacier2/ServerBlobject.h +++ b/cpp/src/Glacier2/ServerBlobject.h @@ -25,14 +25,12 @@ public: ServerBlobject(const Ice::CommunicatorPtr&, const Ice::ConnectionPtr&); virtual ~ServerBlobject(); - virtual void destroy(); - 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: - Ice::ConnectionPtr _connection; + const Ice::ConnectionPtr _connection; }; } |