DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
utilities
include
utilities
ReusableThread.hpp
Go to the documentation of this file.
1
11
#ifndef UTILITIES_INCLUDE_UTILITIES_REUSABLETHREAD_HPP_
12
#define UTILITIES_INCLUDE_UTILITIES_REUSABLETHREAD_HPP_
13
14
#include <atomic>
15
#include <chrono>
16
#include <condition_variable>
17
#include <functional>
18
#include <mutex>
19
#include <string>
20
#include <thread>
21
22
namespace
dunedaq::utilities
{
23
24
class
ReusableThread
25
{
26
public
:
27
explicit
ReusableThread
(
int
threadid = 0);
28
29
~ReusableThread
();
30
31
ReusableThread
(
const
ReusableThread
&) =
delete
;
32
ReusableThread
&
operator=
(
const
ReusableThread
&) =
delete
;
33
ReusableThread
(
ReusableThread
&&) =
delete
;
34
ReusableThread
&
operator=
(
ReusableThread
&&) =
delete
;
35
36
// Set thread ID
37
void
set_thread_id
(
int
tid) {
m_thread_id
= tid; }
38
39
// Get thread ID
40
int
get_thread_id
()
const
{
return
m_thread_id
; }
41
42
// Set name for pthread handle
43
void
set_name
(
const
std::string& name,
int
tid);
44
45
// Pin thread to CPU
46
void
set_pin
(
int
cpuid);
47
48
// Check for completed task execution
49
bool
get_readiness
()
const
{
return
m_task_executed
; }
50
51
// Set task to be executed
52
template
<
typename
Function,
typename
... Args>
53
bool
set_work
(Function&& f, Args&&... args)
54
{
55
if
(!
m_task_assigned
&&
m_task_executed
.exchange(
false
)) {
56
m_task
= std::bind(f, args...);
// NOLINT
57
m_task_assigned
=
true
;
58
m_cv
.notify_all();
59
return
true
;
60
}
61
return
false
;
62
}
63
64
private
:
65
// Internals
66
int
m_thread_id
;
67
std::atomic<bool>
m_task_executed
;
68
std::atomic<bool>
m_task_assigned
;
69
std::atomic<bool>
m_thread_quit
;
70
std::atomic<bool>
m_worker_done
;
71
std::atomic<bool>
m_named
;
72
std::function<void()>
m_task
;
73
74
// Locks
75
std::mutex
m_mtx
;
76
std::condition_variable
m_cv
;
77
std::thread
m_thread
;
78
79
// Actual worker thread
80
void
thread_worker
();
81
};
82
83
}
// namespace dunedaq::utilities
84
85
#endif
// UTILITIES_INCLUDE_UTILITIES_REUSABLETHREAD_HPP_
dunedaq::utilities::ReusableThread::m_thread_id
int m_thread_id
Definition
ReusableThread.hpp:66
dunedaq::utilities::ReusableThread::m_worker_done
std::atomic< bool > m_worker_done
Definition
ReusableThread.hpp:70
dunedaq::utilities::ReusableThread::thread_worker
void thread_worker()
Definition
ReusableThread.cpp:72
dunedaq::utilities::ReusableThread::set_work
bool set_work(Function &&f, Args &&... args)
Definition
ReusableThread.hpp:53
dunedaq::utilities::ReusableThread::m_task_assigned
std::atomic< bool > m_task_assigned
Definition
ReusableThread.hpp:68
dunedaq::utilities::ReusableThread::m_named
std::atomic< bool > m_named
Definition
ReusableThread.hpp:71
dunedaq::utilities::ReusableThread::m_cv
std::condition_variable m_cv
Definition
ReusableThread.hpp:76
dunedaq::utilities::ReusableThread::m_mtx
std::mutex m_mtx
Definition
ReusableThread.hpp:75
dunedaq::utilities::ReusableThread::get_thread_id
int get_thread_id() const
Definition
ReusableThread.hpp:40
dunedaq::utilities::ReusableThread::~ReusableThread
~ReusableThread()
Definition
ReusableThread.cpp:27
dunedaq::utilities::ReusableThread::operator=
ReusableThread & operator=(const ReusableThread &)=delete
ReusableThread is not copy-assginable.
dunedaq::utilities::ReusableThread::get_readiness
bool get_readiness() const
Definition
ReusableThread.hpp:49
dunedaq::utilities::ReusableThread::ReusableThread
ReusableThread(const ReusableThread &)=delete
ReusableThread is not copy-constructible.
dunedaq::utilities::ReusableThread::ReusableThread
ReusableThread(int threadid=0)
Definition
ReusableThread.cpp:17
dunedaq::utilities::ReusableThread::m_thread_quit
std::atomic< bool > m_thread_quit
Definition
ReusableThread.hpp:69
dunedaq::utilities::ReusableThread::set_name
void set_name(const std::string &name, int tid)
Definition
ReusableThread.cpp:41
dunedaq::utilities::ReusableThread::m_task_executed
std::atomic< bool > m_task_executed
Definition
ReusableThread.hpp:67
dunedaq::utilities::ReusableThread::operator=
ReusableThread & operator=(ReusableThread &&)=delete
ReusableThread is not move-assignable.
dunedaq::utilities::ReusableThread::ReusableThread
ReusableThread(ReusableThread &&)=delete
ReusableThread is not move-constructible.
dunedaq::utilities::ReusableThread::m_thread
std::thread m_thread
Definition
ReusableThread.hpp:77
dunedaq::utilities::ReusableThread::m_task
std::function< void()> m_task
Definition
ReusableThread.hpp:72
dunedaq::utilities::ReusableThread::set_thread_id
void set_thread_id(int tid)
Definition
ReusableThread.hpp:37
dunedaq::utilities::ReusableThread::set_pin
void set_pin(int cpuid)
Definition
ReusableThread.cpp:53
dunedaq::utilities
Definition
TimestampEstimatorTimeSync.hxx:3
Generated on
for DUNE-DAQ by
1.17.0