Index: kernel/generic/src/synch/waitq.c
===================================================================
--- kernel/generic/src/synch/waitq.c	(revision 6adbe3c2c208fc6a1a2f4a5f8fc1436d383025dc)
+++ kernel/generic/src/synch/waitq.c	(revision 51ec40fa633067000ae92bcd7b38fde49fdfe205)
@@ -384,9 +384,8 @@
  * timeout.
  *
- * @param wq Pointer to wait queue.
- * @param all If this is non-zero, all sleeping threads will be woken up and
- * 	missed count will be zeroed.
- */
-void waitq_wakeup(waitq_t *wq, bool all)
+ * @param wq	Pointer to wait queue.
+ * @param mode	Wakeup mode.
+ */
+void waitq_wakeup(waitq_t *wq, wakeup_mode_t mode)
 {
 	ipl_t ipl;
@@ -395,8 +394,8 @@
 	spinlock_lock(&wq->lock);
 
-	_waitq_wakeup_unsafe(wq, all);
-
-	spinlock_unlock(&wq->lock);	
-	interrupts_restore(ipl);	
+	_waitq_wakeup_unsafe(wq, mode);
+
+	spinlock_unlock(&wq->lock);
+	interrupts_restore(ipl);
 }
 
@@ -406,20 +405,25 @@
  * assumes wq->lock is already locked and interrupts are already disabled.
  *
- * @param wq Pointer to wait queue.
- * @param all If this is non-zero, all sleeping threads will be woken up and
- * 	missed count will be zeroed.
- */
-void _waitq_wakeup_unsafe(waitq_t *wq, bool all)
+ * @param wq	Pointer to wait queue.
+ * @param mode	If mode is WAKEUP_FIRST, then the longest waiting thread,
+ *		if any, is woken up. If mode is WAKEUP_ALL, then all
+ *		waiting threads, if any, are woken up. If there are no
+ *		waiting threads to be woken up, the missed wakeup is
+ *		recorded in the wait queue.
+ */
+void _waitq_wakeup_unsafe(waitq_t *wq, wakeup_mode_t mode)
 {
 	thread_t *t;
+	count_t count = 0;
 
 loop:	
 	if (list_empty(&wq->head)) {
 		wq->missed_wakeups++;
-		if (all)
-			wq->missed_wakeups = 0;
+		if (count && mode == WAKEUP_ALL)
+			wq->missed_wakeups--;
 		return;
 	}
 
+	count++;
 	t = list_get_instance(wq->head.next, thread_t, wq_link);
 	
@@ -450,5 +454,5 @@
 	thread_ready(t);
 
-	if (all)
+	if (mode == WAKEUP_ALL)
 		goto loop;
 }
