DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::utilities::ReusableThread Class Reference

#include <ReusableThread.hpp>

Public Member Functions

 ReusableThread (int threadid=0)
 
 ~ReusableThread ()
 
 ReusableThread (const ReusableThread &)=delete
 ReusableThread is not copy-constructible.
 
ReusableThreadoperator= (const ReusableThread &)=delete
 ReusableThread is not copy-assginable.
 
 ReusableThread (ReusableThread &&)=delete
 ReusableThread is not move-constructible.
 
ReusableThreadoperator= (ReusableThread &&)=delete
 ReusableThread is not move-assignable.
 
void set_thread_id (int tid)
 
int get_thread_id () const
 
void set_name (const std::string &name, int tid)
 
void set_pin (int cpuid)
 
bool get_readiness () const
 
template<typename Function , typename... Args>
bool set_work (Function &&f, Args &&... args)
 

Private Member Functions

void thread_worker ()
 

Private Attributes

int m_thread_id
 
std::atomic< boolm_task_executed
 
std::atomic< boolm_task_assigned
 
std::atomic< boolm_thread_quit
 
std::atomic< boolm_worker_done
 
std::atomic< boolm_named
 
std::function< void()> m_task
 
std::mutex m_mtx
 
std::condition_variable m_cv
 
std::thread m_thread
 

Detailed Description

Definition at line 24 of file ReusableThread.hpp.

Constructor & Destructor Documentation

◆ ReusableThread() [1/3]

dunedaq::utilities::ReusableThread::ReusableThread ( int threadid = 0)
explicit

◆ ~ReusableThread()

dunedaq::utilities::ReusableThread::~ReusableThread ( )

Definition at line 27 of file ReusableThread.cpp.

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}

◆ ReusableThread() [2/3]

dunedaq::utilities::ReusableThread::ReusableThread ( const ReusableThread & )
delete

ReusableThread is not copy-constructible.

◆ ReusableThread() [3/3]

dunedaq::utilities::ReusableThread::ReusableThread ( ReusableThread && )
delete

ReusableThread is not move-constructible.

Member Function Documentation

◆ get_readiness()

bool dunedaq::utilities::ReusableThread::get_readiness ( ) const
inline

Definition at line 49 of file ReusableThread.hpp.

49{ return m_task_executed; }

◆ get_thread_id()

int dunedaq::utilities::ReusableThread::get_thread_id ( ) const
inline

Definition at line 40 of file ReusableThread.hpp.

40{ return m_thread_id; }

◆ operator=() [1/2]

ReusableThread & dunedaq::utilities::ReusableThread::operator= ( const ReusableThread & )
delete

ReusableThread is not copy-assginable.

◆ operator=() [2/2]

ReusableThread & dunedaq::utilities::ReusableThread::operator= ( ReusableThread && )
delete

ReusableThread is not move-assignable.

◆ set_name()

void dunedaq::utilities::ReusableThread::set_name ( const std::string & name,
int tid )

Definition at line 41 of file ReusableThread.cpp.

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}

◆ set_pin()

void dunedaq::utilities::ReusableThread::set_pin ( int cpuid)

Definition at line 53 of file ReusableThread.cpp.

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}
#define ERS_HERE
void warning(const Issue &issue)
Definition ers.hpp:115

◆ set_thread_id()

void dunedaq::utilities::ReusableThread::set_thread_id ( int tid)
inline

Definition at line 37 of file ReusableThread.hpp.

◆ set_work()

template<typename Function , typename... Args>
bool dunedaq::utilities::ReusableThread::set_work ( Function && f,
Args &&... args )
inline

Definition at line 53 of file ReusableThread.hpp.

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 }

◆ thread_worker()

void dunedaq::utilities::ReusableThread::thread_worker ( )
private

Definition at line 72 of file ReusableThread.cpp.

73{
74 std::unique_lock<std::mutex> lock(m_mtx);
75
76 while (!m_thread_quit) {
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}

Member Data Documentation

◆ m_cv

std::condition_variable dunedaq::utilities::ReusableThread::m_cv
private

Definition at line 76 of file ReusableThread.hpp.

◆ m_mtx

std::mutex dunedaq::utilities::ReusableThread::m_mtx
private

Definition at line 75 of file ReusableThread.hpp.

◆ m_named

std::atomic<bool> dunedaq::utilities::ReusableThread::m_named
private

Definition at line 71 of file ReusableThread.hpp.

◆ m_task

std::function<void()> dunedaq::utilities::ReusableThread::m_task
private

Definition at line 72 of file ReusableThread.hpp.

◆ m_task_assigned

std::atomic<bool> dunedaq::utilities::ReusableThread::m_task_assigned
private

Definition at line 68 of file ReusableThread.hpp.

◆ m_task_executed

std::atomic<bool> dunedaq::utilities::ReusableThread::m_task_executed
private

Definition at line 67 of file ReusableThread.hpp.

◆ m_thread

std::thread dunedaq::utilities::ReusableThread::m_thread
private

Definition at line 77 of file ReusableThread.hpp.

◆ m_thread_id

int dunedaq::utilities::ReusableThread::m_thread_id
private

Definition at line 66 of file ReusableThread.hpp.

◆ m_thread_quit

std::atomic<bool> dunedaq::utilities::ReusableThread::m_thread_quit
private

Definition at line 69 of file ReusableThread.hpp.

◆ m_worker_done

std::atomic<bool> dunedaq::utilities::ReusableThread::m_worker_done
private

Definition at line 70 of file ReusableThread.hpp.


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