[kernel] fix the AUTOUNSIGNAL path on kernel events to wait until a thread waits on the event
in the case of it being signalled when there is no waiters pending.
diff --git a/kernel/event.c b/kernel/event.c
index bd71e75..188b5d3 100644
--- a/kernel/event.c
+++ b/kernel/event.c
@@ -101,11 +101,11 @@
if (!e->signalled) {
e->signalled = true;
if (e->flags & EVENT_FLAG_AUTOUNSIGNAL) {
- /* release one thread and unsignal again */
- wait_queue_wake_one(&e->wait, reschedule, NO_ERROR);
- e->signalled = false;
+ /* try to release one thread and unsignal again if successful */
+ if (wait_queue_wake_one(&e->wait, reschedule, NO_ERROR) > 0)
+ e->signalled = false;
} else {
- /* relase all threads and remain signalled */
+ /* release all threads and remain signalled */
wait_queue_wake_all(&e->wait, reschedule, NO_ERROR);
}
}