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< bool > m_task_executed
 
std::atomic< bool > m_task_assigned
 
std::atomic< bool > m_thread_quit
 
std::atomic< bool > m_worker_done
 
std::atomic< bool > m_named
 
std::function< void()> m_task
 
std::mutex m_mtx
 
std::condition_variable m_cv
 
std::thread m_thread
 

Detailed Description

Definition at line 25 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 25 of file ReusableThread.cpp.

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}

◆ 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 50 of file ReusableThread.hpp.

50{ return m_task_executed; }

◆ get_thread_id()

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

Definition at line 41 of file ReusableThread.hpp.

41{ 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 39 of file ReusableThread.cpp.

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}

◆ set_pin()

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

Definition at line 51 of file ReusableThread.cpp.

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}
#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 38 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 54 of file ReusableThread.hpp.

55 {
56 if (!m_task_assigned && m_task_executed.exchange(false)) {
57 m_task = std::bind(f, args...);
58 m_task_assigned = true;
59 m_cv.notify_all();
60 return true;
61 }
62 return false;
63 }

◆ thread_worker()

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

Definition at line 70 of file ReusableThread.cpp.

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

Member Data Documentation

◆ m_cv

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

Definition at line 77 of file ReusableThread.hpp.

◆ m_mtx

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

Definition at line 76 of file ReusableThread.hpp.

◆ m_named

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

Definition at line 72 of file ReusableThread.hpp.

◆ m_task

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

Definition at line 73 of file ReusableThread.hpp.

◆ m_task_assigned

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

Definition at line 69 of file ReusableThread.hpp.

◆ m_task_executed

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

Definition at line 68 of file ReusableThread.hpp.

◆ m_thread

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

Definition at line 78 of file ReusableThread.hpp.

◆ m_thread_id

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

Definition at line 67 of file ReusableThread.hpp.

◆ m_thread_quit

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

Definition at line 70 of file ReusableThread.hpp.

◆ m_worker_done

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

Definition at line 71 of file ReusableThread.hpp.


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