18 #ifndef INCLUDED_UHD_UTILS_ATOMIC_HPP
19 #define INCLUDED_UHD_UTILS_ATOMIC_HPP
23 #include <boost/thread/thread.hpp>
24 #include <boost/interprocess/detail/atomic.hpp>
26 #include <boost/version.hpp>
27 #if BOOST_VERSION >= 104800
28 # define BOOST_IPC_DETAIL boost::interprocess::ipcdetail
30 # define BOOST_IPC_DETAIL boost::interprocess::detail
45 UHD_INLINE boost::uint32_t
cas(boost::uint32_t newval, boost::uint32_t cmp){
46 return BOOST_IPC_DETAIL::atomic_cas32(&_num, newval, cmp);
51 BOOST_IPC_DETAIL::atomic_write32(&_num, newval);
56 return BOOST_IPC_DETAIL::atomic_read32(&_num);
61 return BOOST_IPC_DETAIL::atomic_inc32(&_num);
66 return BOOST_IPC_DETAIL::atomic_dec32(&_num);
69 private:
volatile boost::uint32_t _num;
91 _count.write(boost::uint32_t(~0));
98 while (_count.read() != _size){
99 boost::this_thread::interruption_point();
100 if (_count.read() == boost::uint32_t(~0))
101 throw boost::thread_interrupted();
102 boost::this_thread::yield();
120 boost::uint32_t value,
123 if (cond.
read() == value)
return true;
125 while (cond.
read() != value){
127 boost::this_thread::interruption_point();
128 boost::this_thread::yield();