summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp38
-rw-r--r--cpp/src/Ice/ConnectionFactory.h6
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp10
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h1
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&);