![]() |
Bitcoin Core 22.99.0
P2P Digital Currency
|
Simple class for background tasks that should be run periodically or once "after a while". More...
#include <scheduler.h>
Public Types | |
| typedef std::function< void()> | Function |
Public Member Functions | |
| CScheduler () | |
| ~CScheduler () | |
| void | schedule (Function f, std::chrono::system_clock::time_point t) |
| Call func at/after time t. More... | |
| void | scheduleFromNow (Function f, std::chrono::milliseconds delta) |
| Call f once after the delta has passed. More... | |
| void | scheduleEvery (Function f, std::chrono::milliseconds delta) |
| Repeat f until the scheduler is stopped. More... | |
| void | MockForward (std::chrono::seconds delta_seconds) |
| Mock the scheduler to fast forward in time. More... | |
| void | serviceQueue () |
| Services the queue 'forever'. More... | |
| void | stop () |
| Tell any threads running serviceQueue to stop as soon as the current task is done. More... | |
| void | StopWhenDrained () |
| Tell any threads running serviceQueue to stop when there is no work left to be done. More... | |
| size_t | getQueueInfo (std::chrono::system_clock::time_point &first, std::chrono::system_clock::time_point &last) const |
| Returns number of tasks waiting to be serviced, and first and last task times. More... | |
| bool | AreThreadsServicingQueue () const |
| Returns true if there are threads actively running in serviceQueue() More... | |
Public Attributes | |
| std::thread | m_service_thread |
Private Member Functions | |
| std::multimap< std::chrono::system_clock::time_point, Function > taskQueue | GUARDED_BY (newTaskMutex) |
| int nThreadsServicingQueue | GUARDED_BY (newTaskMutex) |
| bool stopRequested | GUARDED_BY (newTaskMutex) |
| bool stopWhenEmpty | GUARDED_BY (newTaskMutex) |
| bool | shouldStop () const EXCLUSIVE_LOCKS_REQUIRED(newTaskMutex) |
Private Attributes | |
| Mutex | newTaskMutex |
| std::condition_variable | newTaskScheduled |
Simple class for background tasks that should be run periodically or once "after a while".
Usage:
CScheduler* s = new CScheduler(); s->scheduleFromNow(doSomething, std::chrono::milliseconds{11}); // Assuming a: void doSomething() { } s->scheduleFromNow([=] { this->func(argument); }, std::chrono::milliseconds{3}); std::thread* t = new std::thread([&] { s->serviceQueue(); });
... then at program shutdown, make sure to call stop() to clean up the thread(s) running serviceQueue: s->stop(); t->join(); delete t; delete s; // Must be done after thread is interrupted/joined.
Definition at line 33 of file scheduler.h.
| typedef std::function<void()> CScheduler::Function |
Definition at line 41 of file scheduler.h.
| CScheduler::CScheduler | ( | ) |
Definition at line 15 of file scheduler.cpp.
| CScheduler::~CScheduler | ( | ) |
| bool CScheduler::AreThreadsServicingQueue | ( | ) | const |
Returns true if there are threads actively running in serviceQueue()
Definition at line 129 of file scheduler.cpp.
| size_t CScheduler::getQueueInfo | ( | std::chrono::system_clock::time_point & | first, |
| std::chrono::system_clock::time_point & | last | ||
| ) | const |
Returns number of tasks waiting to be serviced, and first and last task times.
Definition at line 117 of file scheduler.cpp.
|
private |
|
inlineprivate |
Definition at line 101 of file scheduler.h.
|
inlineprivate |
Definition at line 102 of file scheduler.h.
|
inlineprivate |
Definition at line 103 of file scheduler.h.
| void CScheduler::MockForward | ( | std::chrono::seconds | delta_seconds | ) |
Mock the scheduler to fast forward in time.
Iterates through items on taskQueue and reschedules them to be delta_seconds sooner.
Definition at line 84 of file scheduler.cpp.
| void CScheduler::schedule | ( | CScheduler::Function | f, |
| std::chrono::system_clock::time_point | t | ||
| ) |
Call func at/after time t.
Definition at line 75 of file scheduler.cpp.
| void CScheduler::scheduleEvery | ( | CScheduler::Function | f, |
| std::chrono::milliseconds | delta | ||
| ) |
Repeat f until the scheduler is stopped.
First run is after delta has passed once.
The timing is not exact: Every time f is finished, it is rescheduled to run again after delta. If you need more accurate scheduling, don't use this method.
Definition at line 112 of file scheduler.cpp.
|
inline |
Call f once after the delta has passed.
Definition at line 47 of file scheduler.h.
| void CScheduler::serviceQueue | ( | ) |
Services the queue 'forever'.
Should be run in a thread.
Definition at line 26 of file scheduler.cpp.
|
inlineprivate |
|
inline |
Tell any threads running serviceQueue to stop as soon as the current task is done.
Definition at line 73 of file scheduler.h.
|
inline |
Tell any threads running serviceQueue to stop when there is no work left to be done.
Definition at line 80 of file scheduler.h.
| std::thread CScheduler::m_service_thread |
Definition at line 39 of file scheduler.h.
|
mutableprivate |
Definition at line 98 of file scheduler.h.
|
private |
Definition at line 99 of file scheduler.h.