diff --git a/hypervisor/common/event.c b/hypervisor/common/event.c index e05cd963c..b58dc27f2 100644 --- a/hypervisor/common/event.c +++ b/hypervisor/common/event.c @@ -11,7 +11,7 @@ void init_event(struct sched_event *event) { spinlock_init(&event->lock); - event->set = false; + event->nqueued = 0; event->waiting_thread = NULL; } @@ -20,7 +20,7 @@ void reset_event(struct sched_event *event) uint64_t rflag; spinlock_irqsave_obtain(&event->lock, &rflag); - event->set = false; + event->nqueued = 0; event->waiting_thread = NULL; spinlock_irqrestore_release(&event->lock, rflag); } @@ -33,13 +33,13 @@ void wait_event(struct sched_event *event) spinlock_irqsave_obtain(&event->lock, &rflag); ASSERT((event->waiting_thread == NULL), "only support exclusive waiting"); event->waiting_thread = sched_get_current(get_pcpu_id()); - while (!event->set && (event->waiting_thread != NULL)) { + event->nqueued++; + while ((event->nqueued > 0) && (event->waiting_thread != NULL)) { sleep_thread(event->waiting_thread); spinlock_irqrestore_release(&event->lock, rflag); schedule(); spinlock_irqsave_obtain(&event->lock, &rflag); } - event->set = false; event->waiting_thread = NULL; spinlock_irqrestore_release(&event->lock, rflag); } @@ -49,7 +49,7 @@ void signal_event(struct sched_event *event) uint64_t rflag; spinlock_irqsave_obtain(&event->lock, &rflag); - event->set = true; + event->nqueued--; if (event->waiting_thread != NULL) { wake_thread(event->waiting_thread); } diff --git a/hypervisor/include/common/event.h b/hypervisor/include/common/event.h index 78430b21e..2aba27b32 100644 --- a/hypervisor/include/common/event.h +++ b/hypervisor/include/common/event.h @@ -4,7 +4,7 @@ struct sched_event { spinlock_t lock; - bool set; + int8_t nqueued; struct thread_object* waiting_thread; };