18 #ifndef INCLUDED_UHD_UTILS_ATOMIC_HPP
19 #define INCLUDED_UHD_UTILS_ATOMIC_HPP
23 #include <boost/thread/thread.hpp>
24 #include <boost/thread/mutex.hpp>
25 #include <boost/thread/condition_variable.hpp>
26 #include <boost/interprocess/detail/atomic.hpp>
28 #include <boost/version.hpp>
29 #if BOOST_VERSION >= 104800
30 # define BOOST_IPC_DETAIL boost::interprocess::ipcdetail
32 # define BOOST_IPC_DETAIL boost::interprocess::detail
47 UHD_INLINE boost::uint32_t
cas(boost::uint32_t newval, boost::uint32_t cmp){
48 return BOOST_IPC_DETAIL::atomic_cas32(&_num, newval, cmp);
53 BOOST_IPC_DETAIL::atomic_write32(&_num, newval);
58 return BOOST_IPC_DETAIL::atomic_read32(&_num);
63 return BOOST_IPC_DETAIL::atomic_inc32(&_num);
68 return BOOST_IPC_DETAIL::atomic_dec32(&_num);
71 private:
volatile boost::uint32_t _num;
98 if (_size == 1)
return;
101 _entry_counter.inc();
102 _entry_counter.cas(0, _size);
103 boost::mutex::scoped_lock lock(_mutex);
104 while (_entry_counter.read() != 0)
106 this->check_interrupt();
107 _cond.timed_wait(lock, boost::posix_time::milliseconds(1));
114 _exit_counter.cas(0, _size);
115 while (_exit_counter.read() != 0) this->check_interrupt();
121 while (_entry_counter.read() != (_size-1)) this->check_interrupt();
130 boost::condition_variable _cond;
134 if (_done.read() != 0)
throw boost::thread_interrupted();
135 boost::this_thread::interruption_point();
136 boost::this_thread::yield();
149 boost::uint32_t value,
152 if (cond.
read() == value)
return true;
154 while (cond.
read() != value){
156 boost::this_thread::interruption_point();
157 boost::this_thread::yield();