25 #include <condition_variable>
28 #pragma GCC diagnostic push
29 #pragma GCC diagnostic ignored "-Wunused-parameter"
30 #include <boost/thread.hpp>
32 #pragma GCC diagnostic pop
41 using Guard = std::lock_guard<std::mutex>;
44 using ReadGuard = boost::shared_lock<boost::shared_mutex>;
46 using UpgradeGuard = boost::upgrade_to_unique_lock<boost::shared_mutex>;
47 using WriteGuard = boost::unique_lock<boost::shared_mutex>;
49 template <
class GuardType,
class MutexType>
55 template <
class MutexType>
63 template <
class MutexType>
81 operator N()
const {
UniqueGuard l(m_mutex);
return m_value; }
84 void wait(N
const& _v)
const {
UniqueGuard l(m_mutex); m_cv.wait(l, [&](){
return m_value == _v;}); }
85 void waitNot(N
const& _v)
const {
UniqueGuard l(m_mutex); m_cv.wait(l, [&](){
return m_value != _v;}); }
86 template <
class F>
void wait(
F const& _f)
const {
UniqueGuard l(m_mutex); m_cv.wait(l, _f); }
88 template <
class R,
class P>
void wait(std::chrono::duration<R, P> _d)
const { N old; {
UniqueGuard l(m_mutex); old = m_value; }
waitNot(_d, old); }
89 template <
class R,
class P>
void wait(std::chrono::duration<R, P> _d, N
const& _v)
const {
UniqueGuard l(m_mutex); m_cv.wait_for(l, _d, [&](){
return m_value == _v;}); }
90 template <
class R,
class P>
void waitNot(std::chrono::duration<R, P> _d, N
const& _v)
const {
UniqueGuard l(m_mutex); m_cv.wait_for(l, _d, [&](){
return m_value != _v;}); }
91 template <
class R,
class P,
class F>
void wait(std::chrono::duration<R, P> _d,
F const& _f)
const {
UniqueGuard l(m_mutex); m_cv.wait_for(l, _d, _f); }
94 mutable Mutex m_mutex;
95 mutable std::condition_variable m_cv;
132 #define DEV_GUARDED(MUTEX) \
133 for (GenericGuardBool<Guard, Mutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
134 #define DEV_READ_GUARDED(MUTEX) \
135 for (GenericGuardBool<ReadGuard, SharedMutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
136 #define DEV_WRITE_GUARDED(MUTEX) \
137 for (GenericGuardBool<WriteGuard, SharedMutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
138 #define DEV_RECURSIVE_GUARDED(MUTEX) \
139 for (GenericGuardBool<RecursiveGuard, RecursiveMutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
140 #define DEV_UNGUARDED(MUTEX) \
141 for (GenericUnguardBool<Mutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
142 #define DEV_READ_UNGUARDED(MUTEX) \
143 for (GenericUnguardSharedBool<SharedMutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)
144 #define DEV_WRITE_UNGUARDED(MUTEX) \
145 for (GenericUnguardBool<SharedMutex> __eth_l(MUTEX); __eth_l.b; __eth_l.b = false)