rendez_wakeup() has a return value
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 14 Oct 2013 22:31:14 +0000 (15:31 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:06:34 +0000 (11:06 -0800)
A bool, telling the caller if anything was woken up.  The original plan9
wakeup() returned a proc*, for instance.  The uses I've seen of it (2)
are okay with a bool.

kern/include/rendez.h
kern/src/rendez.c

index e819bdb..f48a704 100644 (file)
@@ -49,6 +49,6 @@ void rendez_init(struct rendez *rv);
 void rendez_sleep(struct rendez *rv, int (*cond)(void*), void *arg);
 void rendez_sleep_timeout(struct rendez *rv, int (*cond)(void*), void *arg,
                           unsigned int msec);
-void rendez_wakeup(struct rendez *rv);
+bool rendez_wakeup(struct rendez *rv);
 
 #endif /* ROS_KERN_RENDEZ_H */
index 52e6a1c..472e706 100644 (file)
@@ -72,10 +72,17 @@ void rendez_sleep_timeout(struct rendez *rv, int (*cond)(void*), void *arg,
        unset_alarm(pcpui_tchain, &awaiter);
 }
 
-void rendez_wakeup(struct rendez *rv)
+/* plan9 rendez returned a pointer to the proc woken up.  we return "true" if we
+ * woke someone up. */
+bool rendez_wakeup(struct rendez *rv)
 {
        int8_t irq_state = 0;
+       bool ret;
        /* The plan9 style "one sleeper, one waker" could get by with a signal here.
         * But we want to make sure all potential waiters are woken up. */
-       cv_broadcast_irqsave(&rv->cv, &irq_state);
+       cv_lock_irqsave(&rv->cv, &irq_state);
+       ret = rv->cv.nr_waiters ? TRUE : FALSE;
+       __cv_broadcast(&rv->cv);
+       cv_unlock_irqsave(&rv->cv, &irq_state);
+       return ret;
 }