19 assert(nThreadsServicingQueue == 0);
25 ++nThreadsServicingQueue;
45 if (
newTaskScheduled.wait_until(lock, timeToWaitFor) == std::cv_status::timeout) {
55 Function f = taskQueue.begin()->second;
56 taskQueue.erase(taskQueue.begin());
65 --nThreadsServicingQueue;
69 --nThreadsServicingQueue;
89 taskQueue.emplace(t, f);
96 schedule(f, std::chrono::system_clock::now() + std::chrono::milliseconds(deltaMilliSeconds));
102 s->
scheduleFromNow(std::bind(&Repeat, s, f, deltaMilliSeconds), deltaMilliSeconds);
107 scheduleFromNow(std::bind(&Repeat,
this, f, deltaMilliSeconds), deltaMilliSeconds);
114 size_t result = taskQueue.size();
115 if (!taskQueue.empty()) {
116 first = taskQueue.begin()->first;
117 last = taskQueue.rbegin()->first;
124 return nThreadsServicingQueue;
140 std::function<void (
void)> callback;
153 struct RAIICallbacksRunning {
156 ~RAIICallbacksRunning() {
163 } raiicallbacksrunning(
this);
180 bool should_continue =
true;
181 while (should_continue) {
void stop(bool drain=false)
void schedule(Function f, std::chrono::system_clock::time_point t)
std::function< void(void)> Function
void scheduleFromNow(Function f, int64_t deltaMilliSeconds)
size_t getQueueInfo(std::chrono::system_clock::time_point &first, std::chrono::system_clock::time_point &last) const
void scheduleEvery(Function f, int64_t deltaMilliSeconds)
bool shouldStop() const EXCLUSIVE_LOCKS_REQUIRED(newTaskMutex)
bool AreThreadsServicingQueue() const
std::condition_variable newTaskScheduled
Class used by CScheduler clients which may schedule multiple jobs which are required to be run serial...
void MaybeScheduleProcessQueue()
size_t CallbacksPending()
RecursiveMutex m_cs_callbacks_pending
CScheduler * m_pscheduler
std::list< std::function< void(void)> > m_callbacks_pending
bool m_are_callbacks_running
void AddToProcessQueue(std::function< void(void)> func)
Add a callback to be executed.
clock::time_point time_point
#define WAIT_LOCK(cs, name)