DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq
sourcecode
utilities
src
ReusableThread.cpp
Go to the documentation of this file.
1
12
#include "
utilities/ReusableThread.hpp
"
13
#include "
utilities/WorkerThread.hpp
"
// contains exception definition
14
15
16
dunedaq::utilities::ReusableThread::ReusableThread
(
int
threadid)
17
: m_thread_id(threadid)
18
, m_task_executed(true)
19
, m_task_assigned(false)
20
, m_thread_quit(false)
21
, m_worker_done(false)
22
, m_thread(&
ReusableThread
::thread_worker, this)
23
{}
24
25
dunedaq::utilities::ReusableThread::~ReusableThread
()
26
{
27
while
(m_task_assigned) {
28
std::this_thread::sleep_for(std::chrono::milliseconds(1));
29
}
30
m_thread_quit =
true
;
31
while
(!m_worker_done) {
32
std::this_thread::sleep_for(std::chrono::milliseconds(1));
33
m_cv.notify_all();
34
}
35
m_thread.join();
36
}
37
38
void
39
dunedaq::utilities::ReusableThread::set_name
(
const
std::string& name,
int
tid)
40
{
41
set_thread_id(tid);
42
char
tname[16];
43
snprintf(tname, 16,
"%s-%d"
, name.c_str(), tid);
// NOLINT
44
auto
handle = m_thread.native_handle();
45
pthread_setname_np(handle, tname);
46
47
m_named =
true
;
48
}
49
50
void
51
dunedaq::utilities::ReusableThread::set_pin
(
int
cpuid)
52
{
53
// Require that the thread has been named
54
if
(!m_named) {
55
ers::warning
( ThreadingIssue(
ERS_HERE
,
"May not set CPU affinity for un-named thread"
) );
56
}
57
58
auto
handle = m_thread.native_handle();
59
cpu_set_t cpuset;
60
CPU_ZERO(&cpuset);
61
CPU_SET(cpuid, &cpuset);
62
int
rc = pthread_setaffinity_np(handle,
sizeof
(cpu_set_t), &cpuset);
63
64
if
(rc != 0) {
65
ers::warning
( ThreadingIssue(
ERS_HERE
,
"Error calling pthread_setaffinity_np: "
+ std::to_string( rc ) ) );
66
}
67
}
68
69
void
70
dunedaq::utilities::ReusableThread::thread_worker
()
71
{
72
std::unique_lock<std::mutex> lock(m_mtx);
73
74
while
(!m_thread_quit) {
75
if
(!m_task_executed && m_task_assigned) {
76
m_task();
77
m_task_executed =
true
;
78
m_task_assigned =
false
;
79
}
else
{
80
m_cv.wait(lock);
81
}
82
}
83
84
m_worker_done =
true
;
85
}
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:130
ReusableThread.hpp
WorkerThread.hpp
dunedaq::utilities::ReusableThread
Definition
ReusableThread.hpp:26
dunedaq::utilities::ReusableThread::thread_worker
void thread_worker()
Definition
ReusableThread.cpp:70
dunedaq::utilities::ReusableThread::~ReusableThread
~ReusableThread()
Definition
ReusableThread.cpp:25
dunedaq::utilities::ReusableThread::ReusableThread
ReusableThread(int threadid=0)
Definition
ReusableThread.cpp:16
dunedaq::utilities::ReusableThread::set_name
void set_name(const std::string &name, int tid)
Definition
ReusableThread.cpp:39
dunedaq::utilities::ReusableThread::set_pin
void set_pin(int cpuid)
Definition
ReusableThread.cpp:51
ers::warning
void warning(const Issue &issue)
Definition
ers.hpp:115
Generated on Sat Jun 28 2025 for DUNE-DAQ by
1.12.0