Bitcoin Core  0.20.99
P2P Digital Currency
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
CScheduler Class Reference

Simple class for background tasks that should be run periodically or once "after a while". More...

#include <scheduler.h>

Collaboration diagram for CScheduler:
[legend]

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...
 

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
 

Detailed Description

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 32 of file scheduler.h.

Member Typedef Documentation

◆ Function

typedef std::function<void()> CScheduler::Function

Definition at line 38 of file scheduler.h.

Constructor & Destructor Documentation

◆ CScheduler()

CScheduler::CScheduler ( )

Definition at line 12 of file scheduler.cpp.

◆ ~CScheduler()

CScheduler::~CScheduler ( )

Definition at line 16 of file scheduler.cpp.

Member Function Documentation

◆ AreThreadsServicingQueue()

bool CScheduler::AreThreadsServicingQueue ( ) const

Returns true if there are threads actively running in serviceQueue()

Definition at line 125 of file scheduler.cpp.

Here is the caller graph for this function:

◆ getQueueInfo()

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 113 of file scheduler.cpp.

Here is the caller graph for this function:

◆ GUARDED_BY() [1/4]

std::multimap<std::chrono::system_clock::time_point, Function> taskQueue CScheduler::GUARDED_BY ( newTaskMutex  )
private

◆ GUARDED_BY() [2/4]

int nThreadsServicingQueue CScheduler::GUARDED_BY ( newTaskMutex  )
inlineprivate

Definition at line 97 of file scheduler.h.

◆ GUARDED_BY() [3/4]

bool stopRequested CScheduler::GUARDED_BY ( newTaskMutex  )
inlineprivate

Definition at line 98 of file scheduler.h.

◆ GUARDED_BY() [4/4]

bool stopWhenEmpty CScheduler::GUARDED_BY ( newTaskMutex  )
inlineprivate

Definition at line 99 of file scheduler.h.

◆ MockForward()

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 80 of file scheduler.cpp.

Here is the caller graph for this function:

◆ schedule()

void CScheduler::schedule ( CScheduler::Function  f,
std::chrono::system_clock::time_point  t 
)

Call func at/after time t.

Definition at line 71 of file scheduler.cpp.

Here is the caller graph for this function:

◆ scheduleEvery()

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 108 of file scheduler.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ scheduleFromNow()

void CScheduler::scheduleFromNow ( Function  f,
std::chrono::milliseconds  delta 
)
inline

Call f once after the delta has passed.

Definition at line 44 of file scheduler.h.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ serviceQueue()

void CScheduler::serviceQueue ( )

Services the queue 'forever'.

Should be run in a thread, and interrupted using boost::interrupt_thread

Definition at line 23 of file scheduler.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ shouldStop()

bool CScheduler::shouldStop ( ) const
inlineprivate

Definition at line 100 of file scheduler.h.

Here is the caller graph for this function:

◆ stop()

void CScheduler::stop ( )
inline

Tell any threads running serviceQueue to stop as soon as the current task is done.

Definition at line 71 of file scheduler.h.

◆ StopWhenDrained()

void CScheduler::StopWhenDrained ( )
inline

Tell any threads running serviceQueue to stop when there is no work left to be done.

Definition at line 77 of file scheduler.h.

Here is the call graph for this function:

Member Data Documentation

◆ newTaskMutex

Mutex CScheduler::newTaskMutex
mutableprivate

Definition at line 94 of file scheduler.h.

◆ newTaskScheduled

std::condition_variable CScheduler::newTaskScheduled
private

Definition at line 95 of file scheduler.h.


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