ATLAS Offline Software
Loading...
Searching...
No Matches
HLT::LoopThread Class Reference

Helper class to manage a long-running thread (duration of event loop) More...

#include <EventLoopUtils.h>

Collaboration diagram for HLT::LoopThread:

Public Member Functions

 LoopThread (std::function< void()> &&callback, int callbackInterval=-1)
 ~LoopThread ()
 LoopThread (const LoopThread &)=delete
 LoopThread (LoopThread &&)=delete
LoopThreadoperator= (const LoopThread &)=delete
LoopThreadoperator= (LoopThread &&)=delete
void start ()
 Keep notifying the thread until the callback is called for the first time (returns just before calling the callback)
void stop ()
 Flag the main loop to finish.
void wait ()
 Wait until main loop finishes.
std::condition_variable & cond ()
std::mutex & mutex ()

Private Member Functions

void waitForCond (std::unique_lock< std::mutex > &lock)
 Helper to wait for the condition.
void run ()
 Main function executed by the thread.

Private Attributes

std::condition_variable m_cond
 Condition for which the thread waits most of its lifetime.
std::mutex m_mutex
 Mutex used to notify the condition.
std::atomic< bool > m_keepRunning {true}
 The thread's inner while-loop condition variable.
std::atomic< bool > m_started {false}
 Flag whether the main loop of the thread has started and will listen to further notifications.
std::atomic< bool > m_finished {false}
 Flag whether the main loop of the thread has finished.
std::function< void()> m_callback
 The callback executed in each step of the thread's inner while-loop.
int m_callbackIntervalMilliseconds {-1}
 If positive, call the callback periodically with this interval regardless of the m_cond.
std::unique_ptr< std::thread > m_thread
 The thread object.

Detailed Description

Helper class to manage a long-running thread (duration of event loop)

Definition at line 16 of file EventLoopUtils.h.

Constructor & Destructor Documentation

◆ LoopThread() [1/3]

HLT::LoopThread::LoopThread ( std::function< void()> && callback,
int callbackInterval = -1 )
inlineexplicit

Definition at line 63 of file EventLoopUtils.h.

64 : m_callback(std::move(callback)),
65 m_callbackIntervalMilliseconds(callbackInterval),
66 m_thread(std::make_unique<std::thread>([this]{run();})) {}
std::unique_ptr< std::thread > m_thread
The thread object.
void run()
Main function executed by the thread.
std::function< void()> m_callback
The callback executed in each step of the thread's inner while-loop.
int m_callbackIntervalMilliseconds
If positive, call the callback periodically with this interval regardless of the m_cond.

◆ ~LoopThread()

HLT::LoopThread::~LoopThread ( )
inline

Definition at line 68 of file EventLoopUtils.h.

68 {
69 wait();
70 }
void wait()
Wait until main loop finishes.

◆ LoopThread() [2/3]

HLT::LoopThread::LoopThread ( const LoopThread & )
delete

◆ LoopThread() [3/3]

HLT::LoopThread::LoopThread ( LoopThread && )
delete

Member Function Documentation

◆ cond()

std::condition_variable & HLT::LoopThread::cond ( )
inline

Definition at line 106 of file EventLoopUtils.h.

106{return m_cond;}
std::condition_variable m_cond
Condition for which the thread waits most of its lifetime.

◆ mutex()

std::mutex & HLT::LoopThread::mutex ( )
inline

Definition at line 107 of file EventLoopUtils.h.

107{return m_mutex;}
std::mutex m_mutex
Mutex used to notify the condition.

◆ operator=() [1/2]

LoopThread & HLT::LoopThread::operator= ( const LoopThread & )
delete

◆ operator=() [2/2]

LoopThread & HLT::LoopThread::operator= ( LoopThread && )
delete

◆ run()

void HLT::LoopThread::run ( )
inlineprivate

Main function executed by the thread.

Definition at line 45 of file EventLoopUtils.h.

45 {
46 if (!m_keepRunning) {return;}
47 std::unique_lock<std::mutex> lock{m_mutex};
48
49 // first call outside the loop to set the m_started flag
50 waitForCond(lock);
51 m_started = true;
52 m_callback();
53
54 // subsequent calls in a loop
55 while(m_keepRunning) {
56 waitForCond(lock);
57 m_callback();
58 }
59 m_finished = true;
60 }
std::atomic< bool > m_started
Flag whether the main loop of the thread has started and will listen to further notifications.
void waitForCond(std::unique_lock< std::mutex > &lock)
Helper to wait for the condition.
std::atomic< bool > m_keepRunning
The thread's inner while-loop condition variable.
std::atomic< bool > m_finished
Flag whether the main loop of the thread has finished.

◆ start()

void HLT::LoopThread::start ( )
inline

Keep notifying the thread until the callback is called for the first time (returns just before calling the callback)

Definition at line 80 of file EventLoopUtils.h.

80 {
81 while (!m_started) {
82 std::this_thread::sleep_for(std::chrono::milliseconds(3));
83 m_cond.notify_one();
84 }
85 }

◆ stop()

void HLT::LoopThread::stop ( )
inline

Flag the main loop to finish.

Definition at line 88 of file EventLoopUtils.h.

88 {
89 m_keepRunning=false;
90 m_cond.notify_all();
91 }

◆ wait()

void HLT::LoopThread::wait ( )
inline

Wait until main loop finishes.

Definition at line 94 of file EventLoopUtils.h.

94 {
95 // Nothing to do if thread already finished
96 if (m_thread==nullptr || !m_thread->joinable()) {return;}
97 // Keep notifying the condition until the loop finishes
98 while (!m_finished) {
99 std::this_thread::sleep_for(std::chrono::milliseconds(3));
100 m_cond.notify_all();
101 }
102 // Wait for the thread to return
103 m_thread->join();
104 }

◆ waitForCond()

void HLT::LoopThread::waitForCond ( std::unique_lock< std::mutex > & lock)
inlineprivate

Helper to wait for the condition.

Definition at line 36 of file EventLoopUtils.h.

36 {
38 m_cond.wait(lock);
39 } else {
40 m_cond.wait_for(lock, std::chrono::milliseconds(m_callbackIntervalMilliseconds));
41 }
42 }

Member Data Documentation

◆ m_callback

std::function<void()> HLT::LoopThread::m_callback
private

The callback executed in each step of the thread's inner while-loop.

Definition at line 29 of file EventLoopUtils.h.

◆ m_callbackIntervalMilliseconds

int HLT::LoopThread::m_callbackIntervalMilliseconds {-1}
private

If positive, call the callback periodically with this interval regardless of the m_cond.

Definition at line 31 of file EventLoopUtils.h.

31{-1};

◆ m_cond

std::condition_variable HLT::LoopThread::m_cond
private

Condition for which the thread waits most of its lifetime.

Definition at line 19 of file EventLoopUtils.h.

◆ m_finished

std::atomic<bool> HLT::LoopThread::m_finished {false}
private

Flag whether the main loop of the thread has finished.

Definition at line 27 of file EventLoopUtils.h.

27{false};

◆ m_keepRunning

std::atomic<bool> HLT::LoopThread::m_keepRunning {true}
private

The thread's inner while-loop condition variable.

Definition at line 23 of file EventLoopUtils.h.

23{true};

◆ m_mutex

std::mutex HLT::LoopThread::m_mutex
private

Mutex used to notify the condition.

Definition at line 21 of file EventLoopUtils.h.

◆ m_started

std::atomic<bool> HLT::LoopThread::m_started {false}
private

Flag whether the main loop of the thread has started and will listen to further notifications.

Definition at line 25 of file EventLoopUtils.h.

25{false};

◆ m_thread

std::unique_ptr<std::thread> HLT::LoopThread::m_thread
private

The thread object.

Definition at line 33 of file EventLoopUtils.h.


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