diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.cpp | 38 | ||||
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.h | 6 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 1 |
4 files changed, 41 insertions, 14 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp index bcf4844848f..ab1bc35ce8c 100644 --- a/cpp/src/Ice/ConnectionFactory.cpp +++ b/cpp/src/Ice/ConnectionFactory.cpp @@ -39,7 +39,7 @@ void IceInternal::decRef(IncomingConnectionFactory* p) { p->__decRef(); } ConnectionPtr IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoints) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); if (!_instance) { @@ -159,7 +159,7 @@ IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoi void IceInternal::OutgoingConnectionFactory::setRouter(const RouterPrx& router) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); if (!_instance) { @@ -199,7 +199,7 @@ IceInternal::OutgoingConnectionFactory::setRouter(const RouterPrx& router) void IceInternal::OutgoingConnectionFactory::removeAdapter(const ObjectAdapterPtr& adapter) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); if (!_instance) { @@ -228,7 +228,7 @@ IceInternal::OutgoingConnectionFactory::~OutgoingConnectionFactory() void IceInternal::OutgoingConnectionFactory::destroy() { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); if (!_instance) { @@ -252,14 +252,14 @@ IceInternal::OutgoingConnectionFactory::destroy() void IceInternal::IncomingConnectionFactory::hold() { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); setState(StateHolding); } void IceInternal::IncomingConnectionFactory::activate() { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); setState(StateActive); } @@ -285,7 +285,7 @@ IceInternal::IncomingConnectionFactory::equivalent(const EndpointPtr& endp) cons list<ConnectionPtr> IceInternal::IncomingConnectionFactory::connections() const { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); // // Reap destroyed connections. @@ -312,7 +312,7 @@ IceInternal::IncomingConnectionFactory::read(BasicStream&) void IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPtr& threadPool) { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); threadPool->promoteFollower(); @@ -361,7 +361,7 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt void IceInternal::IncomingConnectionFactory::finished(const ThreadPoolPtr& threadPool) { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); threadPool->promoteFollower(); @@ -401,6 +401,9 @@ IceInternal::IncomingConnectionFactory::finished(const ThreadPoolPtr& threadPool } _acceptor->close(); + + _finished = true; + notifyAll(); // For waitUntilFinished(). } } @@ -428,7 +431,8 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance EventHandler(instance), _endpoint(endpoint), _adapter(adapter), - _state(StateHolding) + _state(StateHolding), + _finished(false) { DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides(); if (defaultsAndOverrides->overrideTimeout) @@ -463,16 +467,28 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance IceInternal::IncomingConnectionFactory::~IncomingConnectionFactory() { assert(_state == StateClosed); + assert(_finished); } void IceInternal::IncomingConnectionFactory::destroy() { - IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); setState(StateClosed); } void +IceInternal::IncomingConnectionFactory::waitUntilFinished() +{ + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + + while (!_finished) + { + wait(); + } +} + +void IceInternal::IncomingConnectionFactory::setState(State state) { if (_state == state) // Don't switch twice. diff --git a/cpp/src/Ice/ConnectionFactory.h b/cpp/src/Ice/ConnectionFactory.h index 9dec534693a..34f778d075d 100644 --- a/cpp/src/Ice/ConnectionFactory.h +++ b/cpp/src/Ice/ConnectionFactory.h @@ -34,7 +34,7 @@ class ObjectAdapterI; namespace IceInternal { -class OutgoingConnectionFactory : public ::IceUtil::Shared, public ::IceUtil::RecMutex +class OutgoingConnectionFactory : public ::IceUtil::Shared, public ::IceUtil::Mutex { public: @@ -53,7 +53,7 @@ private: std::map<EndpointPtr, ConnectionPtr> _connections; }; -class IncomingConnectionFactory : public EventHandler, public ::IceUtil::Mutex +class IncomingConnectionFactory : public EventHandler, public ::IceUtil::Monitor< ::IceUtil::Mutex> { public: @@ -78,6 +78,7 @@ private: IncomingConnectionFactory(const InstancePtr&, const EndpointPtr&, const ::Ice::ObjectAdapterPtr&); virtual ~IncomingConnectionFactory(); void destroy(); + void waitUntilFinished(); friend class ::Ice::ObjectAdapterI; enum State @@ -99,6 +100,7 @@ private: std::list<ConnectionPtr> _connections; State _state; bool _warn; + bool _finished; }; } diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index 7b80c71e8aa..69fc2d477bb 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -99,7 +99,6 @@ Ice::ObjectAdapterI::deactivate() for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), Ice::voidMemFun(&IncomingConnectionFactory::destroy)); - _incomingConnectionFactories.clear(); _instance->outgoingConnectionFactory()->removeAdapter(this); @@ -114,6 +113,15 @@ Ice::ObjectAdapterI::deactivate() _deactivated = true; } +void +Ice::ObjectAdapterI::waitForDeactivate() +{ + IceUtil::Mutex::Lock sync(*this); + + for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), + Ice::voidMemFun(&IncomingConnectionFactory::waitUntilFinished)); +} + ObjectPrx Ice::ObjectAdapterI::add(const ObjectPtr& object, const Identity& ident) { diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index 18f6fc40967..25ce7b13666 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -40,6 +40,7 @@ public: virtual void activate(); virtual void hold(); virtual void deactivate(); + virtual void waitForDeactivate(); virtual ObjectPrx add(const ObjectPtr&, const Identity&); virtual ObjectPrx addWithUUID(const ObjectPtr&); |