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_FOLLYQUEUE_HPP_
2#define IOMANAGER_INCLUDE_IOMANAGER_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 size_t get_capacity() const noexcept override { return m_capacity; }
42
43 size_t get_num_elements() const noexcept override { return m_queue.size(); }
44
45 bool can_pop() const noexcept override { return !m_queue.empty(); }
46
47 void pop(value_t& val, const duration_t& dur) override
48 {
49 if (!m_queue.try_dequeue_for(val, dur)) {
50 throw QueueTimeoutExpired(
51 ERS_HERE, this->get_name(), "pop", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
52 }
53 }
54 bool try_pop(value_t& val, const duration_t& dur) override
55 {
56 if (!m_queue.try_dequeue_for(val, dur)) {
57 return false;
58 }
59 return true;
60 }
61
62 bool can_push() const noexcept override { return m_queue.size() < this->get_capacity(); }
63
64 void push(value_t&& t, const duration_t& dur) override
65 {
66 if (!m_queue.try_enqueue_for(std::move(t), dur)) {
67 throw QueueTimeoutExpired(
68 ERS_HERE, this->get_name(), "push", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
69 }
70 }
71 bool try_push(value_t&& t, const duration_t& dur) override
72 {
73 if (!m_queue.try_enqueue_for(std::move(t), dur)) {
74 ers::error(QueueTimeoutExpired(
75 ERS_HERE, this->get_name(), "push", std::chrono::duration_cast<std::chrono::milliseconds>(dur).count()));
76 return false;
77 }
78 return true;
79 }
80
81 // Delete the copy and move operations
82 FollyQueue(const FollyQueue&) = delete;
83 FollyQueue& operator=(const FollyQueue&) = delete;
86
87private:
88 // The boolean argument is `MayBlock`, where "block" appears to mean
89 // "make a system call". With `MayBlock` set to false, the queue
90 // just spin-waits, so we want true
91 FollyQueueType<T, true> m_queue;
92 size_t m_capacity;
93};
94
95template<typename T>
97
98template<typename T>
100
101} // namespace dunedaq::iomanager
102
103#endif // IOMANAGER_INCLUDE_IOMANAGER_FOLLYQUEUE_HPP_
104
105// Local Variables:
106// c-basic-offset: 2
107// End:
#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:40
std::chrono::milliseconds duration_t
Base duration type for timeouts.
Definition Queue.hpp:43
const std::string & get_name() const final
Get the name of this NamedObejct.
void error(const Issue &issue)
Definition ers.hpp:81