diff --git a/kernel-src/include/event.h b/kernel-src/include/event.h new file mode 100644 index 00000000..9eccebb3 --- /dev/null +++ b/kernel-src/include/event.h @@ -0,0 +1,12 @@ +#ifndef _EVENT_H +#define _EVENT_H + +#include +typedef semaphore_t event_t; + +int event_wait(event_t *event, bool interruptible); +void event_signal(event_t *event); + +#define EVENT_INIT(x) SEMAPHORE_INIT(x, 0); + +#endif diff --git a/kernel-src/lib/event.c b/kernel-src/lib/event.c new file mode 100644 index 00000000..9308dfac --- /dev/null +++ b/kernel-src/lib/event.c @@ -0,0 +1,19 @@ +#include + +// TODO while this works, it is built upon semaphores and might have some race conditions + +int event_wait(event_t *event, bool interruptible) { + int e = semaphore_wait(event, interruptible); + if (e) + return e; + + if (semaphore_haswaiters(event)) + semaphore_signal(event); + + return 0; +} + +void event_signal(event_t *event) { + if (semaphore_haswaiters(event)) + semaphore_signal(event); +}