From 6a51e31a30055d3bb11d38c5cffb1de99396e8d8 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Thu, 6 Oct 2011 15:47:14 +0200 Subject: [PATCH] fixed AtomicBoolen --- pvAccessApp/remote/blockingTCP.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pvAccessApp/remote/blockingTCP.h b/pvAccessApp/remote/blockingTCP.h index 69d2bfd..60a66ea 100644 --- a/pvAccessApp/remote/blockingTCP.h +++ b/pvAccessApp/remote/blockingTCP.h @@ -44,18 +44,21 @@ struct null_deleter void operator()(void const *) const {} }; +// standard performance on set/clear, use of tr1::shared_ptr lock-free counter for get +// alternative is to use boost::atomic class AtomicBoolean { public: - AtomicBoolean() {}; - - void set() { counter.reset(static_cast(0), null_deleter()); } - void clear() { counter.reset(); } + AtomicBoolean() : counter(static_cast(0), null_deleter()) {}; - bool get() { return counter.use_count(); } - + void set() { mutex.lock(); setp = counter; mutex.unlock(); } + void clear() { mutex.lock(); setp.reset(); mutex.unlock(); } + + bool get() const { return counter.use_count() == 2; } private: std::tr1::shared_ptr counter; + std::tr1::shared_ptr setp; + epics::pvData::Mutex mutex; };