DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
iomanager
include
iomanager
queue
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
17
18
#include "
iomanager/queue/Queue.hpp
"
19
20
#include "folly/concurrency/DynamicBoundedQueue.h"
21
#include "
logging/Logging.hpp
"
22
23
#include <string>
24
#include <utility>
// For std::move
25
26
namespace
dunedaq::iomanager
{
27
28
template
<
class
T,
template
<
typename
,
bool
>
class
FollyQueueType>
29
class
FollyQueue
:
public
Queue
<T>
30
{
31
public
:
32
using
value_t
= T;
33
using
duration_t
=
typename
Queue<T>::duration_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
(dur == std::chrono::milliseconds::max()) {
51
// try_dequeue_for adds the dur to now(), which overflows and causes 0 duration
52
// Use base dequeue which blocks indefinitely until it can pop
53
m_queue
.dequeue(val);
54
return
;
55
}
56
if
(!
m_queue
.try_dequeue_for(val, dur)) {
57
throw
QueueTimeoutExpired(
58
ERS_HERE
, this->
get_name
(),
"pop"
, std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
59
}
60
}
61
bool
try_pop
(
value_t
& val,
const
duration_t
& dur)
override
62
{
63
if
(dur == std::chrono::milliseconds::max()) {
64
// try_dequeue_for adds the dur to now(), which overflows and causes 0 duration
65
// Use base dequeue which blocks indefinitely until it can pop
66
m_queue
.dequeue(val);
67
return
true
;
68
}
69
if
(!
m_queue
.try_dequeue_for(val, dur)) {
70
return
false
;
71
}
72
return
true
;
73
}
74
75
bool
can_push
() const noexcept
override
{
return
m_queue
.size() < this->
get_capacity
(); }
76
77
void
push
(
value_t
&& t,
const
duration_t
& dur)
override
78
{
79
if
(dur == std::chrono::milliseconds::max()) {
80
// try_enqueue_for adds the dur to now(), which overflows and causes 0 duration
81
// Use base enqueue which blocks indefinitely until it can push
82
m_queue
.enqueue(std::move(t));
83
return
;
84
}
85
if
(!
m_queue
.try_enqueue_for(std::move(t), dur)) {
86
throw
QueueTimeoutExpired(
87
ERS_HERE
, this->
get_name
(),
"push"
, std::chrono::duration_cast<std::chrono::milliseconds>(dur).count());
88
}
89
}
90
bool
try_push
(
value_t
&& t,
const
duration_t
& dur)
override
91
{
92
if
(dur == std::chrono::milliseconds::max()) {
93
// try_enqueue_for adds the dur to now(), which overflows and causes 0 duration
94
// Use base enqueue which blocks indefinitely until it can push
95
m_queue
.enqueue(std::move(t));
96
return
true
;
97
}
98
if
(!
m_queue
.try_enqueue_for(std::move(t), dur)) {
99
ers::error
(QueueTimeoutExpired(
100
ERS_HERE
, this->
get_name
(),
"push"
, std::chrono::duration_cast<std::chrono::milliseconds>(dur).count()));
101
return
false
;
102
}
103
return
true
;
104
}
105
106
// Delete the copy and move operations
107
FollyQueue
(
const
FollyQueue
&) =
delete
;
108
FollyQueue
&
operator=
(
const
FollyQueue
&) =
delete
;
109
FollyQueue
(
FollyQueue
&&) =
delete
;
110
FollyQueue
&
operator=
(
FollyQueue
&&) =
delete
;
111
112
private
:
113
// The boolean argument is `MayBlock`, where "block" appears to mean
114
// "make a system call". With `MayBlock` set to false, the queue
115
// just spin-waits, so we want true
116
FollyQueueType<T, true>
m_queue
;
117
size_t
m_capacity
;
118
};
119
120
template
<
typename
T>
121
using
FollySPSCQueue
=
FollyQueue<T, folly::DSPSCQueue>
;
122
123
template
<
typename
T>
124
using
FollyMPMCQueue
=
FollyQueue<T, folly::DMPMCQueue>
;
125
126
}
// namespace dunedaq::iomanager
127
128
#endif
// IOMANAGER_INCLUDE_IOMANAGER_QUEUE_FOLLYQUEUE_HPP_
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:141
dunedaq::iomanager::FollyQueue
Definition
FollyQueue.hpp:30
dunedaq::iomanager::FollyQueue::pop
void pop(value_t &val, const duration_t &dur) override
Pop the first value off of the queue.
Definition
FollyQueue.hpp:48
dunedaq::iomanager::FollyQueue::try_pop
bool try_pop(value_t &val, const duration_t &dur) override
Definition
FollyQueue.hpp:61
dunedaq::iomanager::FollyQueue::duration_t
typename Queue< T >::duration_t duration_t
Definition
FollyQueue.hpp:33
dunedaq::iomanager::FollyQueue< T, folly::DSPSCQueue >::m_queue
folly::DSPSCQueue< T, true > m_queue
Definition
FollyQueue.hpp:116
dunedaq::iomanager::FollyQueue::can_pop
bool can_pop() const noexcept override
Determine whether the Queue may be popped from.
Definition
FollyQueue.hpp:46
dunedaq::iomanager::FollyQueue::FollyQueue
FollyQueue(const FollyQueue &)=delete
dunedaq::iomanager::FollyQueue::can_push
bool can_push() const noexcept override
Determine whether the Queue may be pushed onto.
Definition
FollyQueue.hpp:75
dunedaq::iomanager::FollyQueue::try_push
bool try_push(value_t &&t, const duration_t &dur) override
Definition
FollyQueue.hpp:90
dunedaq::iomanager::FollyQueue< T, folly::DSPSCQueue >::m_capacity
size_t m_capacity
Definition
FollyQueue.hpp:117
dunedaq::iomanager::FollyQueue::get_num_elements
size_t get_num_elements() const noexcept override
Definition
FollyQueue.hpp:44
dunedaq::iomanager::FollyQueue::value_t
T value_t
Definition
FollyQueue.hpp:32
dunedaq::iomanager::FollyQueue::push
void push(value_t &&t, const duration_t &dur) override
Push a value onto the Queue.
Definition
FollyQueue.hpp:77
dunedaq::iomanager::FollyQueue::operator=
FollyQueue & operator=(FollyQueue &&)=delete
dunedaq::iomanager::FollyQueue::FollyQueue
FollyQueue(const std::string &name, size_t capacity)
Definition
FollyQueue.hpp:35
dunedaq::iomanager::FollyQueue::FollyQueue
FollyQueue(FollyQueue &&)=delete
dunedaq::iomanager::FollyQueue::operator=
FollyQueue & operator=(const FollyQueue &)=delete
dunedaq::iomanager::FollyQueue::get_capacity
size_t get_capacity() const noexcept override
Get the capacity (max size) of the queue.
Definition
FollyQueue.hpp:42
dunedaq::iomanager::Queue::duration_t
std::chrono::milliseconds duration_t
Base duration type for timeouts.
Definition
Queue.hpp:40
dunedaq::iomanager::Queue::Queue
Queue(const std::string &name)
Queue Constructor.
Definition
Queue.hpp:46
dunedaq::utilities::NamedObject::get_name
const std::string & get_name() const final
Get the name of this NamedObejct.
Definition
NamedObject.hpp:65
Logging.hpp
dunedaq::iomanager
Definition
IOManager.hxx:19
dunedaq::iomanager::FollyMPMCQueue
FollyQueue< T, folly::DMPMCQueue > FollyMPMCQueue
Definition
FollyQueue.hpp:124
dunedaq::iomanager::FollySPSCQueue
FollyQueue< T, folly::DSPSCQueue > FollySPSCQueue
Definition
FollyQueue.hpp:121
ers::error
void error(const Issue &issue)
Definition
ers.hpp:92
Queue.hpp
Generated on
for DUNE-DAQ by
1.17.0