summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Instance.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-02-19 19:13:28 +0100
committerJose <jose@zeroc.com>2015-02-19 19:13:28 +0100
commit52b71d676b80e08b99bb3b7f22645339476c956c (patch)
tree3b2ae5bd88ca31ac279036099374e7a3002b73a5 /cpp/src/Ice/Instance.cpp
parentvolatile usage in Ruby (diff)
downloadice-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.cpp31
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;
{