/* * ===================================================================================== * * Filename: shm_queue.h * * Description: * * Version: 1.0 * Created: 2021年03月25日 10时35分09秒 * Revision: none * Compiler: gcc * * Author: Li Chao (), * Organization: * * ===================================================================================== */ #ifndef SHM_QUEUE_JE0OEUP3 #define SHM_QUEUE_JE0OEUP3 #include "shm.h" #include #include namespace bhome_shm { template using Circular = robust::CircularBuffer>; template class SharedQueue { public: SharedQueue(const uint32_t len, Allocator const &alloc) : queue_(len, alloc) {} bool Read(D &d, const int timeout_ms) { using namespace std::chrono; auto end_time = steady_clock::now() + milliseconds(timeout_ms); do { if (TryRead(d)) { return true; } else { robust::QuickSleep(); } } while (steady_clock::now() < end_time); return false; } bool TryRead(D &d) { return queue_.pop_front(d); } bool TryWrite(const D &d) { return queue_.push_back(d); } private: Circular queue_; }; template class SharedQ63 { public: typedef int64_t Data; bool Read(Data &d, const int timeout_ms) { using namespace std::chrono; auto end_time = steady_clock::now() + milliseconds(timeout_ms); do { if (TryRead(d)) { return true; } else { robust::QuickSleep(); } } while (steady_clock::now() < end_time); return false; } bool TryRead(Data &d, const bool try_more = true) { return queue_.pop(d, try_more); } bool TryWrite(const Data d, const bool try_more = true) { return queue_.push(d, try_more); } private: robust::AtomicQueue queue_; }; } // namespace bhome_shm #endif // end of include guard: SHM_QUEUE_JE0OEUP3