From 1fabbb68dcc039b39f7f7254289c3abd43b43b91 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 11 Jan 2013 17:01:13 +0000 Subject: Fix DoubleBuffer compilation. git-svn-id: http://svn.drobilla.net/lad/trunk/raul@4920 a436a847-0d15-0410-975c-d299462d15a1 --- raul/DoubleBuffer.hpp | 57 +++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 31 deletions(-) (limited to 'raul') diff --git a/raul/DoubleBuffer.hpp b/raul/DoubleBuffer.hpp index 092d529..c2a3051 100644 --- a/raul/DoubleBuffer.hpp +++ b/raul/DoubleBuffer.hpp @@ -35,61 +35,56 @@ template class DoubleBuffer { public: inline DoubleBuffer(T val) - : _state(RAUL_DB_READ_WRITE) + : _state(State::READ_WRITE) { - _vals[0] = val; + _vals[0] = val; _read_val = &_vals[0]; } inline DoubleBuffer(const DoubleBuffer& copy) - : _state(RAUL_DB_READ_WRITE) + : _state(State::READ_WRITE) { - T val = copy.get(); - _vals[0] = val; + _vals[0] = copy.get(); _read_val = &_vals[0]; } inline T& get() const { - return *_read_val.get(); + return *_read_val.load(); } inline bool set(T new_val) { - if (_state.compare_and_exchange(RAUL_DB_READ_WRITE, - RAUL_DB_READ_LOCK)) { - // locked _vals[1] for write - _vals[1] = new_val; + State expected = State::READ_WRITE; + if (_state.compare_exchange_strong(expected, State::READ_LOCK)) { + // Locked _vals[1] for writing + _vals[1] = new_val; _read_val = &_vals[1]; - _state = RAUL_DB_WRITE_READ; + _state = State::WRITE_READ; return true; + } - // concurrent calls here are fine. good, actually - caught - // the WRITE_READ state immediately after it was set above - - } else if (_state.compare_and_exchange(RAUL_DB_WRITE_READ, - RAUL_DB_LOCK_READ)) { - // locked _vals[0] for write - _vals[0] = new_val; + expected = State::WRITE_READ; + if (_state.compare_exchange_strong(expected, State::LOCK_READ)) { + // Locked _vals[0] for writing + _vals[0] = new_val; _read_val = &_vals[0]; - _state = RAUL_DB_READ_WRITE; + _state = State::READ_WRITE; return true; - - } else { - return false; } + + return false; } private: - enum States { - // vals[0] state _ vals[1] state - RAUL_DB_READ_WRITE = 0, - RAUL_DB_READ_LOCK, - RAUL_DB_WRITE_READ, - RAUL_DB_LOCK_READ + enum class State { + READ_WRITE, ///< Read vals[0], Write vals[1] + READ_LOCK, ///< Read vals[0], Lock vals[1] + WRITE_READ, ///< Write vals[0], Write vals[1] + LOCK_READ ///< Lock vals[0], Read vals[1] }; - std::atomic _state; - std::atomic _read_val; - T _vals[2]; + std::atomic _state; + std::atomic _read_val; + T _vals[2]; }; } // namespace Raul -- cgit v1.2.1