|
@@ -106,6 +106,10 @@ static void deliver_alarm(void)
|
|
|
unsigned long long this_tick = os_nsecs();
|
|
|
int one_tick = UM_NSEC_PER_SEC / UM_HZ;
|
|
|
|
|
|
+ /* Protection against the host's time going backwards */
|
|
|
+ if ((last_tick != 0) && (this_tick < last_tick))
|
|
|
+ this_tick = last_tick;
|
|
|
+
|
|
|
if (last_tick == 0)
|
|
|
last_tick = this_tick - one_tick;
|
|
|
|
|
@@ -148,6 +152,9 @@ static int after_sleep_interval(struct timespec *ts)
|
|
|
start_usecs = usec;
|
|
|
|
|
|
start_usecs -= skew / UM_NSEC_PER_USEC;
|
|
|
+ if (start_usecs < 0)
|
|
|
+ start_usecs = 0;
|
|
|
+
|
|
|
tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC,
|
|
|
.tv_usec = start_usecs % UM_USEC_PER_SEC });
|
|
|
interval = ((struct itimerval) { { 0, usec }, tv });
|