dht: make sure searchStep is called when needed.

This commit is contained in:
Simon Désaulniers authored and Adrien Béraud committed 2016-05-02 15:25:15 -04:00
1 parent 08dc666839
commit f7a334a979
2 files changed
+14 -3

No files matched your search

+11 -3
View File
@@ -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;
+3
View File
@@ -970,6 +970,9 @@ Dht::searchStep(std::shared_ptr<Search> sr)
}
}
}
/* periodic searchStep scheduling. */
sr->nextSearchStep = scheduler.edit(sr->nextSearchStep, sr->getNextStepTime(types, now));
}