diff --git a/include/opendht/scheduler.h b/include/opendht/scheduler.h index 6959cb34efa4dcdff2668c2836217da9543201b5..a79ad1e6c111272d13c2ae6807dc6f1c0171b948 100644 --- a/include/opendht/scheduler.h +++ b/include/opendht/scheduler.h @@ -39,6 +39,7 @@ public: struct Job { bool done; bool cancelled; + time_point time; std::function<void()> do_; }; @@ -51,8 +52,10 @@ public: * @return pointer to the newly scheduled job. */ std::shared_ptr<Scheduler::Job> add(time_point time, std::function<void()> job_func) { - auto job = std::make_shared<Job>(Job {false, false, std::move(job_func)}); - timers.emplace(std::move(time), job); + auto scheduled_time = std::max(time, now); /* This should prevent running an auto rescheduling job forever + before the Scheduler::run method ends. */ + auto job = std::make_shared<Job>(Job {false, false, scheduled_time, std::move(job_func)}); + timers.emplace(std::move(scheduled_time), job); return job; } @@ -80,7 +83,12 @@ public: syncTime(); while (not timers.empty()) { auto timer = timers.begin(); - if (timer->first > now) + /* + * Running jobs scheduled before "now" prevents run+rescheduling + * loops before this method ends. It is garanteed by the fact that a + * job will at least be scheduled for "now" and not before. + */ + if (not (timer->first < now)) break; auto& job = timer->second; diff --git a/src/dht.cpp b/src/dht.cpp index 98197f7152e4c4d873bf810b532747871c1d8a3d..5df3bc3ac1d060d303ac2896b88708b38b649481 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -970,6 +970,9 @@ Dht::searchStep(std::shared_ptr<Search> sr) } } } + + /* periodic searchStep scheduling. */ + sr->nextSearchStep = scheduler.edit(sr->nextSearchStep, sr->getNextStepTime(types, now)); }