Use a monotonic timer for the event subsystem.
This commit is contained in:
@@ -484,8 +484,7 @@ sudo_ev_add_v1(struct sudo_event_base *base, struct sudo_event *ev,
|
|||||||
TAILQ_REMOVE(&base->timeouts, ev, timeouts_entries);
|
TAILQ_REMOVE(&base->timeouts, ev, timeouts_entries);
|
||||||
}
|
}
|
||||||
/* Convert to absolute time and insert in sorted order; O(n). */
|
/* Convert to absolute time and insert in sorted order; O(n). */
|
||||||
/* XXX - use monotime */
|
sudo_gettime_mono(&ev->timeout);
|
||||||
sudo_gettime_real(&ev->timeout);
|
|
||||||
sudo_timespecadd(&ev->timeout, timo, &ev->timeout);
|
sudo_timespecadd(&ev->timeout, timo, &ev->timeout);
|
||||||
TAILQ_FOREACH(evtmp, &base->timeouts, timeouts_entries) {
|
TAILQ_FOREACH(evtmp, &base->timeouts, timeouts_entries) {
|
||||||
if (sudo_timespeccmp(timo, &evtmp->timeout, <))
|
if (sudo_timespeccmp(timo, &evtmp->timeout, <))
|
||||||
@@ -637,7 +636,7 @@ rescan:
|
|||||||
goto done;
|
goto done;
|
||||||
case 0:
|
case 0:
|
||||||
/* Timed out, activate timeout events. */
|
/* Timed out, activate timeout events. */
|
||||||
sudo_gettime_real(&now);
|
sudo_gettime_mono(&now);
|
||||||
while ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
while ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
||||||
if (sudo_timespeccmp(&ev->timeout, &now, >))
|
if (sudo_timespeccmp(&ev->timeout, &now, >))
|
||||||
break;
|
break;
|
||||||
@@ -759,7 +758,7 @@ sudo_ev_get_timeleft_v1(struct sudo_event *ev, struct timespec *ts)
|
|||||||
debug_return_int(-1);
|
debug_return_int(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sudo_gettime_real(&now);
|
sudo_gettime_mono(&now);
|
||||||
sudo_timespecsub(&ev->timeout, &now, ts);
|
sudo_timespecsub(&ev->timeout, &now, ts);
|
||||||
if (ts->tv_sec < 0 || (ts->tv_sec == 0 && ts->tv_nsec < 0))
|
if (ts->tv_sec < 0 || (ts->tv_sec == 0 && ts->tv_nsec < 0))
|
||||||
sudo_timespecclear(ts);
|
sudo_timespecclear(ts);
|
||||||
|
@@ -159,7 +159,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, int flags)
|
|||||||
debug_decl(sudo_ev_scan_impl, SUDO_DEBUG_EVENT)
|
debug_decl(sudo_ev_scan_impl, SUDO_DEBUG_EVENT)
|
||||||
|
|
||||||
if ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
if ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
||||||
sudo_gettime_real(&now);
|
sudo_gettime_mono(&now);
|
||||||
sudo_timespecsub(&ev->timeout, &now, &ts);
|
sudo_timespecsub(&ev->timeout, &now, &ts);
|
||||||
if (ts.tv_sec < 0 || (ts.tv_sec == 0 && ts.tv_nsec < 0))
|
if (ts.tv_sec < 0 || (ts.tv_sec == 0 && ts.tv_nsec < 0))
|
||||||
sudo_timespecclear(&ts);
|
sudo_timespecclear(&ts);
|
||||||
|
@@ -200,7 +200,7 @@ sudo_ev_scan_impl(struct sudo_event_base *base, int flags)
|
|||||||
debug_decl(sudo_ev_loop, SUDO_DEBUG_EVENT)
|
debug_decl(sudo_ev_loop, SUDO_DEBUG_EVENT)
|
||||||
|
|
||||||
if ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
if ((ev = TAILQ_FIRST(&base->timeouts)) != NULL) {
|
||||||
sudo_gettime_real(&now);
|
sudo_gettime_mono(&now);
|
||||||
sudo_timespecsub(&ev->timeout, &now, &ts);
|
sudo_timespecsub(&ev->timeout, &now, &ts);
|
||||||
if (ts.tv_sec < 0 || (ts.tv_sec == 0 && ts.tv_nsec < 0))
|
if (ts.tv_sec < 0 || (ts.tv_sec == 0 && ts.tv_nsec < 0))
|
||||||
sudo_timespecclear(&ts);
|
sudo_timespecclear(&ts);
|
||||||
|
Reference in New Issue
Block a user