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;
102 if (_size == 1)
return;
105 _entry_counter.inc();
106 _entry_counter.cas(0, _size);
107 boost::mutex::scoped_lock lock(_mutex);
108 while (_entry_counter.read() != 0)
110 this->check_interrupt();
111 _cond.timed_wait(lock, boost::posix_time::milliseconds(1));
118 _exit_counter.cas(0, _size);
119 while (_exit_counter.read() != 0) this->check_interrupt();
125 while (_entry_counter.read() != (_size-1)) this->check_interrupt();
134 boost::condition_variable _cond;
138 if (_done.read() != 0)
throw boost::thread_interrupted();
139 boost::this_thread::interruption_point();
140 boost::this_thread::yield();
153 boost::uint32_t value,
156 if (cond.
read() == value)
return true;
158 while (cond.
read() != value){
160 boost::this_thread::interruption_point();
161 boost::this_thread::yield();