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; };