Ensures IRQs are enabled when proc_destroy()ing
[akaros.git] / kern / src / alarm.c
index fcfc828..b4a00ed 100644 (file)
@@ -68,13 +68,22 @@ void set_awaiter_rel(struct alarm_waiter *waiter, uint64_t usleep)
 {
        uint64_t now, then;
        now = read_tsc();
-       then = now + usleep * (system_timing.tsc_freq / 1000000);
+       then = now + usec2tsc(usleep);
        /* This will go off if we wrap-around the TSC.  It'll never happen for legit
         * values, but this might catch some bugs with large usleeps. */
        assert(now < then);
        set_awaiter_abs(waiter, then);
 }
 
+/* Increment the timer that was already set, so that it goes off usleep usec
+ * from the previous tick.  This is different than 'rel' in that it doesn't care
+ * about when 'now' is. */
+void set_awaiter_inc(struct alarm_waiter *waiter, uint64_t usleep)
+{
+       assert(waiter->wake_up_time != ALARM_POISON_TIME);
+       waiter->wake_up_time += usec2tsc(usleep);
+}
+
 /* Helper, makes sure the interrupt is turned on at the right time.  Most of the
  * heavy lifting is in the timer-source specific function pointer. */
 static void reset_tchain_interrupt(struct timer_chain *tchain)
@@ -257,7 +266,7 @@ void set_pcpu_alarm_interrupt(uint64_t time, struct timer_chain *tchain)
                if (time <= now)
                        rel_usec = 1;
                else
-                       rel_usec = (time - now) / (system_timing.tsc_freq / 1000000);
+                       rel_usec = tsc2usec(time - now);
                rel_usec = MAX(rel_usec, 1);
                printd("Setting alarm for %llu, it is now %llu, rel_time %llu "
                       "tchain %08p\n", time, now, rel_usec, pcpui_tchain);