DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::datahandlinglibs::IterableQueueModel< T > Struct Template Reference

#include <IterableQueueModel.hpp>

Inheritance diagram for dunedaq::datahandlinglibs::IterableQueueModel< T >:
[legend]
Collaboration diagram for dunedaq::datahandlinglibs::IterableQueueModel< T >:
[legend]

Classes

struct  Iterator

Public Types

typedef T value_type
Public Types inherited from dunedaq::opmonlib::MonitorableObject
using NodePtr = std::weak_ptr<MonitorableObject>
using NewNodePtr = std::shared_ptr<MonitorableObject>
using ElementId = std::string

Public Member Functions

 IterableQueueModel (const IterableQueueModel &)=delete
IterableQueueModel & operator= (const IterableQueueModel &)=delete
 IterableQueueModel ()
 IterableQueueModel (std::size_t size, bool numa_aware=false, uint8_t numa_node=0, bool intrinsic_allocator=false, std::size_t alignment_size=0)
 ~IterableQueueModel ()
void free_memory ()
void allocate_memory (std::size_t size, bool numa_aware, uint8_t numa_node=0, bool intrinsic_allocator=false, std::size_t alignment_size=0)
void allocate_memory (std::size_t size) override
void prefill_task ()
void force_pagefault ()
bool write (T &&record) override
 Move referenced object into LB.
bool read (T &record) override
 Move object from LB to referenced.
void popFront ()
void pop (std::size_t x)
 Pop specified amount of elements from LB.
bool isEmpty () const
bool isFull () const
std::size_t occupancy () const override
 Occupancy of LB.
std::size_t size () const
std::size_t capacity () const
const T * front () override
 Get pointer to the front of the LB.
const T * back () override
 Get pointer to the back of the LB.
T * start_of_buffer ()
T * end_of_buffer ()
void conf (const appmodel::LatencyBuffer *cfg) override
 Configure the LB.
void scrap (const appfwk::DAQModule::CommandData_t &) override
 Unconfigure the LB.
void flush () override
 Flush all elements from the latency buffer.
std::size_t get_alignment_size ()
Iterator begin ()
Iterator end ()
Public Member Functions inherited from dunedaq::datahandlinglibs::LatencyBufferConcept< T >
 LatencyBufferConcept ()
virtual ~LatencyBufferConcept ()
 LatencyBufferConcept (const LatencyBufferConcept &)=delete
 LatencyBufferConcept is not copy-constructible.
LatencyBufferConcept & operator= (const LatencyBufferConcept &)=delete
 LatencyBufferConcept is not copy-assginable.
 LatencyBufferConcept (LatencyBufferConcept &&)=delete
 LatencyBufferConcept is not move-constructible.
LatencyBufferConcept & operator= (LatencyBufferConcept &&)=delete
 LatencyBufferConcept is not move-assignable.
virtual void allocate_memory (size_t)=0
 Allocate memory for LB.
Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject (const MonitorableObject &)=delete
MonitorableObject & operator= (const MonitorableObject &)=delete
 MonitorableObject (MonitorableObject &&)=delete
MonitorableObject & operator= (MonitorableObject &&)=delete
virtual ~MonitorableObject ()=default
auto get_opmon_id () const noexcept
auto get_opmon_level () const noexcept

Static Public Attributes

static constexpr bool expects_order = true

Protected Member Functions

virtual void generate_opmon_data () override
template<class... Args>
bool write_ (Args &&... recordArgs)
Protected Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject ()=default
void register_node (ElementId name, NewNodePtr)
void publish (google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

Protected Attributes

std::atomic< int > overflow_ctr { 0 }
bool numa_aware_
uint8_t numa_node_
bool intrinsic_allocator_
std::size_t alignment_size_
bool invalid_configuration_requested_
std::string prefiller_name_ { "lbpfn" }
std::mutex prefill_mutex_
std::condition_variable prefill_cv_
bool prefill_ready_
bool prefill_done_
std::thread ptrlogger
char pad0_ [folly::hardware_destructive_interference_size]
uint32_t size_
T * records_
std::atomic< unsigned int > readIndex_
std::atomic< unsigned int > writeIndex_
char pad1_ [folly::hardware_destructive_interference_size - sizeof(writeIndex_)]

Additional Inherited Members

Static Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
static bool publishable_metric (OpMonLevel entry, OpMonLevel system) noexcept

Detailed Description

template<class T>
struct dunedaq::datahandlinglibs::IterableQueueModel< T >

IterableQueueModel is a one producer and one consumer queue without locks. Modified version of the folly::ProducerConsumerQueue via adding a readPtr function. Requires well defined and followed constraints on the consumer side.

Also, note that the number of usable slots in the queue at any given time is actually (size-1), so if you start with an empty queue, isFull() will return true after size-1 insertions.

Definition at line 71 of file IterableQueueModel.hpp.

Member Typedef Documentation

◆ value_type

template<class T>
typedef T dunedaq::datahandlinglibs::IterableQueueModel< T >::value_type

Definition at line 73 of file IterableQueueModel.hpp.

Constructor & Destructor Documentation

◆ IterableQueueModel() [1/3]

template<class T>
dunedaq::datahandlinglibs::IterableQueueModel< T >::IterableQueueModel ( const IterableQueueModel< T > & )
delete

◆ IterableQueueModel() [2/3]

template<class T>
dunedaq::datahandlinglibs::IterableQueueModel< T >::IterableQueueModel ( )
inline

Definition at line 81 of file IterableQueueModel.hpp.

83 , numa_aware_(false)
84 , numa_node_(0)
88 , prefill_ready_(false)
89 , prefill_done_(false)
90 , size_(2)
91 , records_(static_cast<T*>(std::malloc(sizeof(T) * 2)))
92 , readIndex_(0)
93 , writeIndex_(0)
94 {
95 }

◆ IterableQueueModel() [3/3]

template<class T>
dunedaq::datahandlinglibs::IterableQueueModel< T >::IterableQueueModel ( std::size_t size,
bool numa_aware = false,
uint8_t numa_node = 0,
bool intrinsic_allocator = false,
std::size_t alignment_size = 0 )
inline

Definition at line 98 of file IterableQueueModel.hpp.

103 : LatencyBufferConcept<T>() // NOLINT(build/unsigned)
109 , prefill_ready_(false)
110 , prefill_done_(false)
111 , size_(size)
112 , readIndex_(0)
113 , writeIndex_(0)
114 {
115 assert(size >= 2);
117
118 if (!records_) {
119 throw std::bad_alloc();
120 }
121#if 0
122 ptrlogger = std::thread([&](){
123 while(true) {
126 TLOG() << "BEG:" << std::hex << &records_[0] << " END:" << &records_[size] << std::dec
127 << " R:" << currentRead << " - W:" << currentWrite
128 << " OFLOW:" << overflow_ctr;
130 }
131 });
132#endif
133 }
void allocate_memory(std::size_t size, bool numa_aware, uint8_t numa_node=0, bool intrinsic_allocator=false, std::size_t alignment_size=0)

◆ ~IterableQueueModel()

Member Function Documentation

◆ allocate_memory() [1/2]

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::allocate_memory ( std::size_t size)
inlineoverride

Definition at line 148 of file IterableQueueModel.hpp.

148{ allocate_memory(size, false); }

◆ allocate_memory() [2/2]

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::allocate_memory ( std::size_t size,
bool numa_aware,
uint8_t numa_node = 0,
bool intrinsic_allocator = false,
std::size_t alignment_size = 0 )

Definition at line 39 of file IterableQueueModel.hxx.

44{
45 assert(size >= 2);
46 // TODO: check for valid alignment sizes! | July-21-2021 | Roland Sipos | rsipos@cern.ch
47
48 if (numa_aware &&
49 numa_node < 8) { // numa allocator from libnuma; we get "numa_node >= 0" for free, given its datatype
50#ifdef WITH_LIBNUMA_SUPPORT
51 numa_set_preferred((unsigned)numa_node); // https://linux.die.net/man/3/numa_set_preferred
52#ifdef WITH_LIBNUMA_BIND_POLICY
53 numa_set_bind_policy(WITH_LIBNUMA_BIND_POLICY); // https://linux.die.net/man/3/numa_set_bind_policy
54#endif
55#ifdef WITH_LIBNUMA_STRICT_POLICY
56 numa_set_strict(WITH_LIBNUMA_STRICT_POLICY); // https://linux.die.net/man/3/numa_set_strict
57#endif
58 records_ = static_cast<T*>(numa_alloc_onnode(sizeof(T) * size, numa_node));
59#else
61 "NUMA allocation was requested but program was built without USE_LIBNUMA");
62#endif
63 } else if (intrinsic_allocator && alignment_size > 0) { // _mm allocator
64 records_ = static_cast<T*>(_mm_malloc(sizeof(T) * size, alignment_size));
65 } else if (!intrinsic_allocator && alignment_size > 0) { // std aligned allocator
66 records_ = static_cast<T*>(std::aligned_alloc(alignment_size, sizeof(T) * size));
67 } else if (!numa_aware && !intrinsic_allocator && alignment_size == 0) {
68 // Standard allocator
69 records_ = static_cast<T*>(std::malloc(sizeof(T) * size));
70
71 } else {
72 // Let it fail, as expected combination might be invalid
73 // records_ = static_cast<T*>(std::malloc(sizeof(T) * size_);
74 }
75
76 size_ = size;
81}

◆ back()

template<class T>
const T * dunedaq::datahandlinglibs::IterableQueueModel< T >::back ( )
overridevirtual

Get pointer to the back of the LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 280 of file IterableQueueModel.hxx.

281{
284 return nullptr;
285 }
287 if (currentLast == 0) {
288 currentLast = size_ - 1;
289 } else {
290 currentLast--;
291 }
292 return &records_[currentLast];
293}

◆ begin()

template<class T>
Iterator dunedaq::datahandlinglibs::IterableQueueModel< T >::begin ( )
inline

Definition at line 270 of file IterableQueueModel.hpp.

271 {
274 // queue is empty
275 return end();
276 }
277 return Iterator(*this, currentRead);
278 }
Iterator(IterableQueueModel< T > &queue, uint32_t index)

◆ capacity()

template<class T>
std::size_t dunedaq::datahandlinglibs::IterableQueueModel< T >::capacity ( ) const
inline

Definition at line 186 of file IterableQueueModel.hpp.

186{ return size_ - 1; }

◆ conf()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::conf ( const appmodel::LatencyBuffer * conf)
overridevirtual

Configure the LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 298 of file IterableQueueModel.hxx.

299{
300 assert(cfg->get_size() >= 2);
301 free_memory();
302
303 allocate_memory(cfg->get_size(),
304 cfg->get_numa_aware(),
305 cfg->get_numa_node(),
306 cfg->get_intrinsic_allocator(),
308 readIndex_ = 0;
309 writeIndex_ = 0;
310
311 if (!records_) {
312 throw std::bad_alloc();
313 }
314
315 if (cfg->get_preallocation()) {
317 }
318}

◆ end()

template<class T>
Iterator dunedaq::datahandlinglibs::IterableQueueModel< T >::end ( )
inline

Definition at line 280 of file IterableQueueModel.hpp.

281 {
282 return Iterator(*this, std::numeric_limits<uint32_t>::max()); // NOLINT(build/unsigned)
283 }

◆ end_of_buffer()

template<class T>
T * dunedaq::datahandlinglibs::IterableQueueModel< T >::end_of_buffer ( )
inline

Definition at line 198 of file IterableQueueModel.hpp.

198{ return &records_[size_]; }

◆ flush()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::flush ( )
inlineoverridevirtual

Flush all elements from the latency buffer.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 207 of file IterableQueueModel.hpp.

207{ pop(occupancy()); }
std::size_t occupancy() const override
Occupancy of LB.
void pop(std::size_t x)
Pop specified amount of elements from LB.

◆ force_pagefault()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::force_pagefault ( )

Definition at line 108 of file IterableQueueModel.hxx.

109{
110 // Local prefiller thread
112
113 // Tweak prefiller thread
114 char tname[16];
115 snprintf(tname, 16, "%s-%d", prefiller_name_.c_str(), numa_node_);
116 auto handle = prefill_thread.native_handle();
118
119#ifdef WITH_LIBNUMA_SUPPORT
123 int ret = 0;
124 // Get NODE CPU mask
126 assert(ret == 0);
127 // Apply corresponding NODE CPUs to affinity mask
128 for (int i = 0; i < numa_num_configured_cpus(); ++i) {
131 }
132 }
134 assert(ret == 0);
136#endif
137
138 // Trigger prefiller thread
139 {
141 prefill_ready_ = true;
142 }
143 prefill_cv_.notify_one();
144 // Wait for prefiller thread to finish
145 {
147 prefill_cv_.wait(lk, [this] { return prefill_done_; });
148 }
149 // Join with prefiller thread
150 prefill_thread.join();
151}

◆ free_memory()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::free_memory ( )

Definition at line 9 of file IterableQueueModel.hxx.

10{
11 // We need to destruct anything that may still exist in our queue.
12 // (No real synchronization needed at destructor time: only one
13 // thread can be doing this.)
17 while (readIndex != endIndex) {
18 records_[readIndex].~T();
19 if (++readIndex == size_) { // NOLINT(runtime/increment_decrement)
20 readIndex = 0;
21 }
22 }
23 }
24 // Different allocators require custom free functions
27 } else if (numa_aware_) {
28#ifdef WITH_LIBNUMA_SUPPORT
29 numa_free(records_, sizeof(T) * size_);
30#endif
31 } else {
33 }
34}

◆ front()

template<class T>
const T * dunedaq::datahandlinglibs::IterableQueueModel< T >::front ( )
overridevirtual

Get pointer to the front of the LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 268 of file IterableQueueModel.hxx.

269{
272 return nullptr;
273 }
274 return &records_[currentRead];
275}

◆ generate_opmon_data()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::generate_opmon_data ( )
overrideprotectedvirtual

Hook for customisable pubblication. The function can throw, exception will be caught by the monitoring thread

Reimplemented from dunedaq::opmonlib::MonitorableObject.

Definition at line 373 of file IterableQueueModel.hxx.

374{
376 info.set_num_buffer_elements(this->occupancy());
377 this->publish(std::move(info));
378}
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

◆ get_alignment_size()

template<class T>
std::size_t dunedaq::datahandlinglibs::IterableQueueModel< T >::get_alignment_size ( )
inline

Definition at line 210 of file IterableQueueModel.hpp.

210{ return alignment_size_; }

◆ isEmpty()

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::isEmpty ( ) const

Definition at line 226 of file IterableQueueModel.hxx.

◆ isFull()

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::isFull ( ) const

Definition at line 234 of file IterableQueueModel.hxx.

235{
237 if (nextRecord == size_) {
238 nextRecord = 0;
239 }
241 return false;
242 }
243 // queue is full
244 return true;
245}

◆ occupancy()

template<class T>
std::size_t dunedaq::datahandlinglibs::IterableQueueModel< T >::occupancy ( ) const
overridevirtual

Occupancy of LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 255 of file IterableQueueModel.hxx.

256{
257 int ret = static_cast<int>(writeIndex_.load(std::memory_order_acquire)) -
258 static_cast<int>(readIndex_.load(std::memory_order_acquire));
259 if (ret < 0) {
260 ret += static_cast<int>(size_);
261 }
262 return static_cast<std::size_t>(ret);
263}

◆ operator=()

template<class T>
IterableQueueModel & dunedaq::datahandlinglibs::IterableQueueModel< T >::operator= ( const IterableQueueModel< T > & )
delete

◆ pop()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::pop ( std::size_t amount)
virtual

Pop specified amount of elements from LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 216 of file IterableQueueModel.hxx.

217{
218 for (std::size_t i = 0; i < x; i++) {
219 popFront();
220 }
221}

◆ popFront()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::popFront ( )

Definition at line 199 of file IterableQueueModel.hxx.

200{
203
204 auto nextRecord = currentRead + 1;
205 if (nextRecord == size_) {
206 nextRecord = 0;
207 }
208
209 records_[currentRead].~T();
211}

◆ prefill_task()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::prefill_task ( )

Definition at line 85 of file IterableQueueModel.hxx.

86{
87 // Wait until LB issues ready
89 prefill_cv_.wait(lk, [this] { return prefill_ready_; });
90
91 // After wait, we are ready to force page-fault
92 for (size_t i = 0; i < size_ - 1; ++i) {
93 T element = T();
95 }
96 flush();
97
98 // Preallocation done
99 prefill_done_ = true;
100
101 // Manual unlock is done before notify: avoid waking up the waiting thread only to block again.
102 lk.unlock();
103 prefill_cv_.notify_one();
104}
void flush() override
Flush all elements from the latency buffer.

◆ read()

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::read ( T & element)
overridevirtual

Move object from LB to referenced.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 178 of file IterableQueueModel.hxx.

179{
182 // queue is empty
183 return false;
184 }
185
186 auto nextRecord = currentRead + 1;
187 if (nextRecord == size_) {
188 nextRecord = 0;
189 }
191 records_[currentRead].~T();
193 return true;
194}

◆ scrap()

template<class T>
void dunedaq::datahandlinglibs::IterableQueueModel< T >::scrap ( const appfwk::DAQModule::CommandData_t & cfg)
overridevirtual

Unconfigure the LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 323 of file IterableQueueModel.hxx.

324{
325 free_memory();
326 numa_aware_ = false;
327 numa_node_ = 0;
328 intrinsic_allocator_ = false;
329 alignment_size_ = 0;
331 prefill_ready_ = false;
332 prefill_done_ = false;
333 size_ = 2;
334 records_ = static_cast<T*>(std::malloc(sizeof(T) * 2));
335 readIndex_ = 0;
336 writeIndex_ = 0;
337}

◆ size()

template<class T>
std::size_t dunedaq::datahandlinglibs::IterableQueueModel< T >::size ( ) const
inline

Definition at line 183 of file IterableQueueModel.hpp.

183{ return size_; }

◆ start_of_buffer()

template<class T>
T * dunedaq::datahandlinglibs::IterableQueueModel< T >::start_of_buffer ( )
inline

Definition at line 195 of file IterableQueueModel.hpp.

195{ return &records_[0]; }

◆ write()

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::write ( T && element)
overridevirtual

Move referenced object into LB.

Implements dunedaq::datahandlinglibs::LatencyBufferConcept< T >.

Definition at line 156 of file IterableQueueModel.hxx.

157{
159 auto nextRecord = currentWrite + 1;
160 if (nextRecord == size_) {
161 nextRecord = 0;
162 }
163
167 return true;
168 }
169
170 // queue is full
171 ++overflow_ctr;
172 return false;
173}

◆ write_()

template<class T>
template<class... Args>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::write_ ( Args &&... recordArgs)
protected

Definition at line 343 of file IterableQueueModel.hxx.

344{
345 // const std::lock_guard<std::mutex> lock(m_mutex);
347 auto nextRecord = currentWrite + 1;
348 if (nextRecord == size_) {
349 nextRecord = 0;
350 }
351 // if (nextRecord == readIndex_.load(std::memory_order_acquire)) {
352 // std::cout << "SPSC WARNING -> Queue is full! WRITE PASSES READ!!! \n";
353 //}
354 // new (&records_[currentWrite]) T(std::forward<Args>(recordArgs)...);
355 // writeIndex_.store(nextRecord, std::memory_order_release);
356 // return true;
357
358 // ORIGINAL:
362 return true;
363 }
364 // queue is full
365
366 ++overflow_ctr;
367
368 return false;
369}

Member Data Documentation

◆ alignment_size_

template<class T>
std::size_t dunedaq::datahandlinglibs::IterableQueueModel< T >::alignment_size_
protected

Definition at line 299 of file IterableQueueModel.hpp.

◆ expects_order

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::expects_order = true
staticconstexpr

Definition at line 75 of file IterableQueueModel.hpp.

◆ intrinsic_allocator_

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::intrinsic_allocator_
protected

Definition at line 298 of file IterableQueueModel.hpp.

◆ invalid_configuration_requested_

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::invalid_configuration_requested_
protected

Definition at line 300 of file IterableQueueModel.hpp.

◆ numa_aware_

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::numa_aware_
protected

Definition at line 296 of file IterableQueueModel.hpp.

◆ numa_node_

template<class T>
uint8_t dunedaq::datahandlinglibs::IterableQueueModel< T >::numa_node_
protected

Definition at line 297 of file IterableQueueModel.hpp.

◆ overflow_ctr

template<class T>
std::atomic<int> dunedaq::datahandlinglibs::IterableQueueModel< T >::overflow_ctr { 0 }
protected

Definition at line 293 of file IterableQueueModel.hpp.

◆ pad0_

template<class T>
char dunedaq::datahandlinglibs::IterableQueueModel< T >::pad0_[folly::hardware_destructive_interference_size]
protected

Definition at line 315 of file IterableQueueModel.hpp.

◆ pad1_

template<class T>
char dunedaq::datahandlinglibs::IterableQueueModel< T >::pad1_[folly::hardware_destructive_interference_size - sizeof(writeIndex_)]
protected

Definition at line 321 of file IterableQueueModel.hpp.

◆ prefill_cv_

template<class T>
std::condition_variable dunedaq::datahandlinglibs::IterableQueueModel< T >::prefill_cv_
protected

Definition at line 305 of file IterableQueueModel.hpp.

◆ prefill_done_

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::prefill_done_
protected

Definition at line 307 of file IterableQueueModel.hpp.

◆ prefill_mutex_

template<class T>
std::mutex dunedaq::datahandlinglibs::IterableQueueModel< T >::prefill_mutex_
protected

Definition at line 304 of file IterableQueueModel.hpp.

◆ prefill_ready_

template<class T>
bool dunedaq::datahandlinglibs::IterableQueueModel< T >::prefill_ready_
protected

Definition at line 306 of file IterableQueueModel.hpp.

◆ prefiller_name_

template<class T>
std::string dunedaq::datahandlinglibs::IterableQueueModel< T >::prefiller_name_ { "lbpfn" }
protected

Definition at line 303 of file IterableQueueModel.hpp.

◆ ptrlogger

template<class T>
std::thread dunedaq::datahandlinglibs::IterableQueueModel< T >::ptrlogger
protected

Definition at line 310 of file IterableQueueModel.hpp.

◆ readIndex_

template<class T>
std::atomic<unsigned int> dunedaq::datahandlinglibs::IterableQueueModel< T >::readIndex_
protected

Definition at line 318 of file IterableQueueModel.hpp.

◆ records_

template<class T>
T* dunedaq::datahandlinglibs::IterableQueueModel< T >::records_
protected

Definition at line 317 of file IterableQueueModel.hpp.

◆ size_

template<class T>
uint32_t dunedaq::datahandlinglibs::IterableQueueModel< T >::size_
protected

Definition at line 316 of file IterableQueueModel.hpp.

◆ writeIndex_

template<class T>
std::atomic<unsigned int> dunedaq::datahandlinglibs::IterableQueueModel< T >::writeIndex_
protected

Definition at line 320 of file IterableQueueModel.hpp.


The documentation for this struct was generated from the following files: