summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/GC.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-09-17 10:16:43 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-09-17 10:16:43 +0200
commit5a85eebb5e9162260ffb93f217b16f229976288b (patch)
tree93ca91d69e9303d4895d743b7bc08d77741bdb7f /cpp/src/Ice/GC.cpp
parentFixed to remove need for calling updateViews after map registration (diff)
downloadice-5a85eebb5e9162260ffb93f217b16f229976288b.tar.bz2
ice-5a85eebb5e9162260ffb93f217b16f229976288b.tar.xz
ice-5a85eebb5e9162260ffb93f217b16f229976288b.zip
Moved some MX classes to IceInternal
Diffstat (limited to 'cpp/src/Ice/GC.cpp')
-rw-r--r--cpp/src/Ice/GC.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/cpp/src/Ice/GC.cpp b/cpp/src/Ice/GC.cpp
index ac61d7a0c77..184ac36724e 100644
--- a/cpp/src/Ice/GC.cpp
+++ b/cpp/src/Ice/GC.cpp
@@ -12,7 +12,6 @@
#include <IceUtil/RecMutex.h>
#include <Ice/GC.h>
#include <Ice/GCShared.h>
-#include <Ice/Instrumentation.h>
#include <set>
using namespace IceUtil;
@@ -394,5 +393,27 @@ IceInternal::GC::updateObserver(const CommunicatorObserverPtr& observer)
{
Monitor<Mutex>::Lock sync(*this);
assert(observer);
- _observer.attach(observer->getThreadObserver("Communicator", name(), ThreadStateIdle, _observer.get()));
+
+ // Only the first communicator can observe the GC thread.
+ if(!_communicatorObserver)
+ {
+ _communicatorObserver = observer;
+ }
+
+ if(observer == _communicatorObserver)
+ {
+ _observer.attach(observer->getThreadObserver("Communicator", name(), ThreadStateIdle, _observer.get()));
+ }
+}
+
+void
+IceInternal::GC::clearObserver(const CommunicatorObserverPtr& observer)
+{
+ Monitor<Mutex>::Lock sync(*this);
+ assert(observer);
+ if(observer == _communicatorObserver)
+ {
+ _communicatorObserver = 0;
+ _observer.detach();
+ }
}