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
(!
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
;
85
FollyQueue
(
FollyQueue
&&) =
delete
;
86
FollyQueue
&
operator=
(
FollyQueue
&&) =
delete
;
87
88
private
:
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
96
template
<
typename
T>
97
using
FollySPSCQueue
=
FollyQueue<T, folly::DSPSCQueue>
;
98
99
template
<
typename
T>
100
using
FollyMPMCQueue
=
FollyQueue<T, folly::DMPMCQueue>
;
101
102
}
// namespace dunedaq::iomanager
103
104
#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:55
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:92
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:63
dunedaq::iomanager::FollyQueue::try_push
bool try_push(value_t &&t, const duration_t &dur) override
Definition
FollyQueue.hpp:72
dunedaq::iomanager::FollyQueue< T, folly::DSPSCQueue >::m_capacity
size_t m_capacity
Definition
FollyQueue.hpp:93
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:65
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:100
dunedaq::iomanager::FollySPSCQueue
FollyQueue< T, folly::DSPSCQueue > FollySPSCQueue
Definition
FollyQueue.hpp:97
ers::error
void error(const Issue &issue)
Definition
ers.hpp:92
Queue.hpp
Generated on
for DUNE-DAQ by
1.17.0