diff options
author | Jose <jose@zeroc.com> | 2015-02-19 19:13:28 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2015-02-19 19:13:28 +0100 |
commit | 52b71d676b80e08b99bb3b7f22645339476c956c (patch) | |
tree | 3b2ae5bd88ca31ac279036099374e7a3002b73a5 /cpp/src/Ice/Instance.cpp | |
parent | volatile usage in Ruby (diff) | |
download | ice-52b71d676b80e08b99bb3b7f22645339476c956c.tar.bz2 ice-52b71d676b80e08b99bb3b7f22645339476c956c.tar.xz ice-52b71d676b80e08b99bb3b7f22645339476c956c.zip |
Replace volatile with IceUtilInternal::Atomic in c++
Diffstat (limited to 'cpp/src/Ice/Instance.cpp')
-rw-r--r-- | cpp/src/Ice/Instance.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index 1a0ac26f360..479deee7c52 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -49,6 +49,7 @@ #include <IceUtil/UUID.h> #include <IceUtil/Mutex.h> #include <IceUtil/MutexPtrLock.h> +#include <IceUtil/Atomic.h> #include <stdio.h> #include <list> @@ -195,12 +196,12 @@ public: Timer(int priority) : IceUtil::Timer(priority), - _hasObserver(false) + _hasObserver(0) { } Timer() : - _hasObserver(false) + _hasObserver(0) { } @@ -211,7 +212,11 @@ private: virtual void runTimerTask(const IceUtil::TimerTaskPtr&); IceUtil::Mutex _mutex; - volatile bool _hasObserver; + // + // TODO: Replace by std::atomic<bool> when it becomes widely + // available. + // + IceUtilInternal::Atomic _hasObserver; ObserverHelperT<Ice::Instrumentation::ThreadObserver> _observer; }; @@ -220,19 +225,23 @@ private: void Timer::updateObserver(const Ice::Instrumentation::CommunicatorObserverPtr& obsv) { - IceUtil::Mutex::Lock sync(_mutex); - assert(obsv); - _observer.attach(obsv->getThreadObserver("Communicator", - "Ice.Timer", - Ice::Instrumentation::ThreadStateIdle, - _observer.get())); - _hasObserver = _observer.get(); + bool hasObserver = false; + { + IceUtil::Mutex::Lock sync(_mutex); + assert(obsv); + _observer.attach(obsv->getThreadObserver("Communicator", + "Ice.Timer", + Ice::Instrumentation::ThreadStateIdle, + _observer.get())); + hasObserver = _observer.get(); + } + _hasObserver.exchange(hasObserver ? 1 : 0); } void Timer::runTimerTask(const IceUtil::TimerTaskPtr& task) { - if(_hasObserver) + if(_hasObserver != 0) { Ice::Instrumentation::ThreadObserverPtr threadObserver; { |