DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
FollyQueue.hpp
Go to the documentation of this file.
1#ifndef IOMANAGER_INCLUDE_IOMANAGER_QUEUE_FOLLYQUEUE_HPP_
2#define IOMANAGER_INCLUDE_IOMANAGER_QUEUE_FOLLYQUEUE_HPP_
3
19
20#include "folly/concurrency/DynamicBoundedQueue.h"
21#include "logging/Logging.hpp"
22
23#include <string>
24#include <utility> // For std::move
25
26namespace dunedaq::iomanager {
27
28template<class T, template<typename, bool> class FollyQueueType>
29class FollyQueue : public Queue<T>
30{
31public:
32 using value_t = T;
34
35 explicit FollyQueue(const std::string& name, size_t capacity)
36 : Queue<T>(name)
37 , m_queue(capacity)
38 , m_capacity(capacity)
39 {
40 }
41
42 size_t get_capacity() const noexcept override { return m_capacity; }
43
44 size_t get_num_elements() const noexcept override { return m_queue.size(); }
45
46 bool can_pop() const noexcept override { return !m_queue.empty(); }
47
48 void pop(value_t& val, const duration_t& dur) override
49 {
50 if (!m_queue.try_dequeue_for(val, dur)) {
51 throw QueueTimeoutExpired(
52 ERS_HERE, this->get_name(), "pop", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
53 }
54 }
55 bool try_pop(value_t& val, const duration_t& dur) override
56 {
57 if (!m_queue.try_dequeue_for(val, dur)) {
58 return false;
59 }
60 return true;
61 }
62
63 bool can_push() const noexcept override { return m_queue.size() < this->get_capacity(); }
64
65 void push(value_t&& t, const duration_t& dur) override
66 {
67 if (!m_queue.try_enqueue_for(std::move(t), dur)) {
68 throw QueueTimeoutExpired(
69 ERS_HERE, this->get_name(), "push", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
70 }
71 }
72 bool try_push(value_t&& t, const duration_t& dur) override
73 {
74 if (!m_queue.try_enqueue_for(std::move(t), dur)) {
75 ers::error(QueueTimeoutExpired(
76 ERS_HERE, this->get_name(), "push", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count()));
77 return false;
78 }
79 return true;
80 }
81
82 // Delete the copy and move operations
83 FollyQueue(const FollyQueue&) = delete;
84 FollyQueue& operator=(const FollyQueue&) = delete;
87
88private:
89 // The boolean argument is `MayBlock`, where "block" appears to mean
90 // "make a system call". With `MayBlock` set to false, the queue
91 // just spin-waits, so we want true
92 FollyQueueType<T, true> m_queue;
93 size_t m_capacity;
94};
95
96template<typename T>
98
99template<typename T>
101
102} // namespace dunedaq::iomanager
103
104#endif // IOMANAGER_INCLUDE_IOMANAGER_QUEUE_FOLLYQUEUE_HPP_
#define ERS_HERE
void pop(value_t &val, const duration_t &dur) override
Pop the first value off of the queue.
bool try_pop(value_t &val, const duration_t &dur) override
typename Queue< T >::duration_t duration_t
FollyQueueType< T, true > m_queue
bool can_pop() const noexcept override
Determine whether the Queue may be popped from.
FollyQueue(const FollyQueue &)=delete
bool can_push() const noexcept override
Determine whether the Queue may be pushed onto.
bool try_push(value_t &&t, const duration_t &dur) override
size_t get_num_elements() const noexcept override
void push(value_t &&t, const duration_t &dur) override
Push a value onto the Queue.
FollyQueue & operator=(FollyQueue &&)=delete
FollyQueue(const std::string &name, size_t capacity)
FollyQueue(FollyQueue &&)=delete
FollyQueue & operator=(const FollyQueue &)=delete
size_t get_capacity() const noexcept override
Get the capacity (max size) of the queue.
Implementations of the Queue class are responsible for relaying data between DAQModules within a DAQ ...
Definition Queue.hpp:37
std::chrono::milliseconds duration_t
Base duration type for timeouts.
Definition Queue.hpp:40
const std::string & get_name() const final
Get the name of this NamedObejct.
void error(const Issue &issue)
Definition ers.hpp:81