benchutil: Clarify unset_alarm()'s semantics
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 6 Apr 2017 19:01:00 +0000 (15:01 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 3 May 2017 16:13:02 +0000 (12:13 -0400)
Userspace alarm code is based off older versions of the kernel's alarms.
But they both have the same semantics for unset: when unset returns, the
alarm handler has either completed or will never fire.

If we want to support the "non-IRQ" style alarm handlers, we'll probably
want to report the guts of the kernel's tchain code (maybe with CVs).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/benchutil/alarm.c

index 48fb217..7ecc4cf 100644 (file)
@@ -187,8 +187,7 @@ static void __attribute__((constructor)) init_alarm_service(void)
        register_fork_cb(&devalarm_fork_cb);
 }
 
-/* Initializes a new awaiter.  Pass 0 for the function if you want it to be a
- * kthread-alarm, and sleep on it after you set the alarm later. */
+/* Initializes a new awaiter. */
 void init_awaiter(struct alarm_waiter *waiter,
                   void (*func) (struct alarm_waiter *awaiter))
 {
@@ -414,7 +413,10 @@ static bool __remove_awaiter(struct timer_chain *tchain,
 }
 
 /* Removes waiter from the tchain before it goes off.  Returns TRUE if we
- * disarmed before the alarm went off, FALSE if it already fired. */
+ * disarmed before the alarm went off, FALSE if it already fired.  Also, if
+ * FALSE, the alarm has already completed.  Userspace alarms are like kernel IRQ
+ * alarms - they run with the tchain lock held, meaning their execution is
+ * synchronized with operations like unset. */
 static bool __tc_unset_alarm(struct timer_chain *tchain,
                              struct alarm_waiter *waiter)
 {