mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 15:43:32 +01:00
Merge remote-tracking branch 'dgoulet/bug23558_032_01'
This commit is contained in:
commit
a23a168f24
@ -506,7 +506,11 @@ scheduler_ev_add(const struct timeval *next_run)
|
|||||||
{
|
{
|
||||||
tor_assert(run_sched_ev);
|
tor_assert(run_sched_ev);
|
||||||
tor_assert(next_run);
|
tor_assert(next_run);
|
||||||
event_add(run_sched_ev, next_run);
|
if (BUG(event_add(run_sched_ev, next_run) < 0)) {
|
||||||
|
log_warn(LD_SCHED, "Adding to libevent failed. Next run time was set to: "
|
||||||
|
"%ld.%06ld", next_run->tv_sec, next_run->tv_usec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make the scheduler event active with the given flags. */
|
/* Make the scheduler event active with the given flags. */
|
||||||
|
@ -507,16 +507,25 @@ kist_scheduler_schedule(void)
|
|||||||
{
|
{
|
||||||
struct monotime_t now;
|
struct monotime_t now;
|
||||||
struct timeval next_run;
|
struct timeval next_run;
|
||||||
int32_t diff;
|
int64_t diff;
|
||||||
|
|
||||||
if (!have_work()) {
|
if (!have_work()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
monotime_get(&now);
|
monotime_get(&now);
|
||||||
diff = (int32_t) monotime_diff_msec(&scheduler_last_run, &now);
|
|
||||||
|
/* If time is really monotonic, we can never have now being smaller than the
|
||||||
|
* last scheduler run. The scheduler_last_run at first is set to 0. */
|
||||||
|
diff = monotime_diff_msec(&scheduler_last_run, &now);
|
||||||
|
IF_BUG_ONCE(diff < 0) {
|
||||||
|
diff = 0;
|
||||||
|
}
|
||||||
if (diff < sched_run_interval) {
|
if (diff < sched_run_interval) {
|
||||||
next_run.tv_sec = 0;
|
next_run.tv_sec = 0;
|
||||||
/* 1000 for ms -> us */
|
/* Takes 1000 ms -> us. This will always be valid because diff can NOT be
|
||||||
|
* negative and can NOT be smaller than sched_run_interval so values can
|
||||||
|
* only go from 1000 usec (diff set to interval - 1) to 100000 usec (diff
|
||||||
|
* set to 0) for the maximum allowed run interval (100ms). */
|
||||||
next_run.tv_usec = (sched_run_interval - diff) * 1000;
|
next_run.tv_usec = (sched_run_interval - diff) * 1000;
|
||||||
/* Readding an event reschedules it. It does not duplicate it. */
|
/* Readding an event reschedules it. It does not duplicate it. */
|
||||||
scheduler_ev_add(&next_run);
|
scheduler_ev_add(&next_run);
|
||||||
|
Loading…
Reference in New Issue
Block a user