diff options
Diffstat (limited to 'host/lib/include/uhdlib/utils')
| -rw-r--r-- | host/lib/include/uhdlib/utils/atomic.hpp | 74 | ||||
| -rw-r--r-- | host/lib/include/uhdlib/utils/system_time.hpp | 18 | 
2 files changed, 92 insertions, 0 deletions
diff --git a/host/lib/include/uhdlib/utils/atomic.hpp b/host/lib/include/uhdlib/utils/atomic.hpp new file mode 100644 index 000000000..5436eea81 --- /dev/null +++ b/host/lib/include/uhdlib/utils/atomic.hpp @@ -0,0 +1,74 @@ +// +// Copyright 2012-2013,2016-2017 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#ifndef INCLUDED_UHD_UTILS_ATOMIC_HPP +#define INCLUDED_UHD_UTILS_ATOMIC_HPP + +#include <uhd/config.hpp> +#include <uhd/types/time_spec.hpp> +#include <uhdlib/utils/system_time.hpp> +#include <boost/thread/thread.hpp> +#include <atomic> + +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 time_spec_t exit_time = uhd::get_system_time() + time_spec_t(timeout); +        while (cond != value) { +            if (uhd::get_system_time() > exit_time) { +                return false; +            } +            boost::this_thread::interruption_point(); +            boost::this_thread::yield(); +        } +        return true; +    } + +    /*! DEPRECATED -- Will 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. +     */ +    class simple_claimer{ +    public: +        simple_claimer(void){ +            this->release(); +        } + +        UHD_INLINE void release(void){ +            _locked = false; +        } + +        UHD_INLINE bool claim_with_wait(const double timeout){ +            if (spin_wait_with_timeout(_locked, false, timeout)){ +                _locked = true; +                return true; +            } +            return false; +        } + +    private: +        std::atomic<bool> _locked; +    }; + +} //namespace uhd + +#endif /* INCLUDED_UHD_UTILS_ATOMIC_HPP */ diff --git a/host/lib/include/uhdlib/utils/system_time.hpp b/host/lib/include/uhdlib/utils/system_time.hpp new file mode 100644 index 000000000..30cd5a673 --- /dev/null +++ b/host/lib/include/uhdlib/utils/system_time.hpp @@ -0,0 +1,18 @@ +// +// Copyright 2017 Ettus Research (National Instruments Corp.) +// +// SPDX-License-Identifier: GPL-3.0+ +// + +#include <uhd/types/time_spec.hpp> + +namespace uhd { + +    /*! +     * Get the system time in time_spec_t format. +     * Uses the highest precision clock available. +     * \return the system time as a time_spec_t +     */ +    time_spec_t get_system_time(void); + +}; /* namespace uhd */  | 
