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