diff options
author | MarcoFalke <falke.marco@gmail.com> | 2020-03-17 16:34:42 -0400 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2020-03-17 16:34:53 -0400 |
commit | ce87d5613a5537b68cf23e7bc25c1e3770704ff9 (patch) | |
tree | f5841e32a5cd526e889900cebbfd9f0f38018edb /src/scheduler.h | |
parent | 39497d1f3268d3aa75a41d07a5a5442a463265c6 (diff) | |
parent | fa36f3a29538012a6eb5c3402b3b3c18fd32b230 (diff) |
Merge #18289: refactor: Make scheduler methods type safe
fa36f3a29538012a6eb5c3402b3b3c18fd32b230 refactor: move DUMP_BANS_INTERVAL to banman.h (MarcoFalke)
fadafb83cff9a9a340eac1b5a853e2467d5e0ef7 scheduler: Make schedule* methods type safe (MarcoFalke)
fa70ccc6c4e304646b4610228f3975b3a9762643 scheduler: Use C++11 member initialization, add shutdown assert (MarcoFalke)
Pull request description:
Main benefit is that stuff like `15 * 60 * 1000` is replaced by `minutes{15}`
ACKs for top commit:
vasild:
ACK fa36f3a (code review, not tested)
ajtowns:
ACK fa36f3a29538012a6eb5c3402b3b3c18fd32b230
jonatack:
ACK fa36f3a
Tree-SHA512: f35f1a1d643dfa676bd47474659f6492ed05cca04cdb556064b126f654a6a44a4b93fcaddcdcd41faf81b8f11439c11e5c7ab88685ba2eef12f7188843d17ad8
Diffstat (limited to 'src/scheduler.h')
-rw-r--r-- | src/scheduler.h | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/scheduler.h b/src/scheduler.h index 4d5aa3068e..1e64195484 100644 --- a/src/scheduler.h +++ b/src/scheduler.h @@ -24,8 +24,8 @@ // Usage: // // CScheduler* s = new CScheduler(); -// s->scheduleFromNow(doSomething, 11); // Assuming a: void doSomething() { } -// s->scheduleFromNow(std::bind(Class::func, this, argument), 3); +// s->scheduleFromNow(doSomething, std::chrono::milliseconds{11}); // Assuming a: void doSomething() { } +// s->scheduleFromNow([=] { this->func(argument); }, std::chrono::milliseconds{3}); // boost::thread* t = new boost::thread(std::bind(CScheduler::serviceQueue, s)); // // ... then at program shutdown, make sure to call stop() to clean up the thread(s) running serviceQueue: @@ -46,15 +46,19 @@ public: // Call func at/after time t void schedule(Function f, std::chrono::system_clock::time_point t); - // Convenience method: call f once deltaMilliSeconds from now - void scheduleFromNow(Function f, int64_t deltaMilliSeconds); + /** Call f once after the delta has passed */ + void scheduleFromNow(Function f, std::chrono::milliseconds delta) + { + schedule(std::move(f), std::chrono::system_clock::now() + delta); + } - // Another convenience method: call f approximately - // every deltaMilliSeconds forever, starting deltaMilliSeconds from now. - // To be more precise: every time f is finished, it - // is rescheduled to run deltaMilliSeconds later. If you - // need more accurate scheduling, don't use this method. - void scheduleEvery(Function f, int64_t deltaMilliSeconds); + /** + * 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. + */ + void scheduleEvery(Function f, std::chrono::milliseconds delta); /** * Mock the scheduler to fast forward in time. @@ -86,9 +90,9 @@ private: mutable Mutex newTaskMutex; std::condition_variable newTaskScheduled; 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); + int nThreadsServicingQueue GUARDED_BY(newTaskMutex){0}; + bool stopRequested GUARDED_BY(newTaskMutex){false}; + bool stopWhenEmpty GUARDED_BY(newTaskMutex){false}; bool shouldStop() const EXCLUSIVE_LOCKS_REQUIRED(newTaskMutex) { return stopRequested || (stopWhenEmpty && taskQueue.empty()); } }; |