aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/include/uhdlib/utils/atomic.hpp57
1 files changed, 19 insertions, 38 deletions
diff --git a/host/lib/include/uhdlib/utils/atomic.hpp b/host/lib/include/uhdlib/utils/atomic.hpp
index 33bc78fed..0db828ee9 100644
--- a/host/lib/include/uhdlib/utils/atomic.hpp
+++ b/host/lib/include/uhdlib/utils/atomic.hpp
@@ -9,67 +9,48 @@
#include <uhd/config.hpp>
#include <uhd/types/time_spec.hpp>
-#include <boost/thread/thread.hpp>
#include <atomic>
#include <chrono>
namespace uhd {
-/*! DEPRECATED -- Will be removed in coming versions of UHD.
- *
- * Spin-wait on a condition with a timeout.
- * \param cond an atomic variable to compare
- * \param value compare to atomic for true/false
- * \param timeout the timeout in seconds
- * \return true for cond == value, false for timeout
- */
-template <typename T>
-UHD_INLINE bool spin_wait_with_timeout(
- std::atomic<T>& cond, const T value, const double timeout)
-{
- if (cond == value)
- return true;
- const auto exit_time = std::chrono::high_resolution_clock::now()
- + std::chrono::microseconds(int64_t(timeout * 1e6));
- while (cond != value) {
- if (std::chrono::high_resolution_clock::now() > exit_time) {
- return false;
- }
- boost::this_thread::interruption_point();
- boost::this_thread::yield();
- }
- return true;
-}
-
-/*! DEPRECATED -- Will be removed in coming versions of UHD.
+/*! DEPRECATED -- May be removed in coming versions of UHD.
*
* Claimer class to provide synchronization for multi-thread access.
- * Claiming enables buffer classes to be used with a buffer queue.
+ *
+ * Implements a spinlock mutex with a timeout.
*/
class simple_claimer
{
public:
simple_claimer(void)
{
- this->release();
+ _locked.clear();
}
- UHD_INLINE void release(void)
+ inline void release(void)
{
- _locked = false;
+ _locked.clear(std::memory_order_release);
}
- UHD_INLINE bool claim_with_wait(const double timeout)
+ //!
+ // \param timeout Timeout in seconds
+ inline bool claim_with_wait(const double timeout)
{
- if (spin_wait_with_timeout(_locked, false, timeout)) {
- _locked = true;
- return true;
+ const auto exit_time = std::chrono::high_resolution_clock::now()
+ + std::chrono::microseconds(int64_t(timeout * 1e6));
+ // Try acquiring lock until successful or timeout
+ while (_locked.test_and_set(std::memory_order_acquire)) {
+ if (std::chrono::high_resolution_clock::now() > exit_time) {
+ return false;
+ }
+ std::this_thread::yield();
}
- return false;
+ return true;
}
private:
- std::atomic<bool> _locked;
+ std::atomic_flag _locked;
};
} // namespace uhd