Files
Astral/kernel-src/include/kernel/event.h
T
2026-09-23 20:48:29 +03:00

45 lines
1.2 KiB
C

#ifndef _EVENT_H
#define _EVENT_H
#include <kernel/poll.h>
typedef pollheader_t eventheader_t;
#define EVENT_MAX_ATTACHMENT 5
typedef struct {
polldesc_t polldesc;
polldata_t polldata[EVENT_MAX_ATTACHMENT];
int current;
} eventlistener_t;
#define EVENT_INITHEADER(e) POLL_INITHEADER(e)
#define EVENT_INITLISTENER(e) { \
poll_initdesc(&(e)->polldesc, 0); \
(e)->polldesc.data = (e)->polldata; \
(e)->polldesc.size = EVENT_MAX_ATTACHMENT; \
(e)->current = 0; \
for (int i = 0; i < EVENT_MAX_ATTACHMENT; ++i) { \
(e)->polldata[i].desc = &(e)->polldesc; \
(e)->polldata[i].header = NULL; \
} \
}
#define EVENT_ATTACH(e, h) { \
if ((e)->current >= EVENT_MAX_ATTACHMENT) { \
/* spin forever to say that there have been too many attachments */ \
/* this should never happen normally and is meant as a way to alert whoever is programming about it */ \
for (;;) asm volatile(""); \
} \
poll_add(h, &(e)->polldata[(e)->current++], POLLPRI); \
}
#define EVENT_WAIT(e, t) poll_dowait(&(e)->polldesc, t)
#define EVENT_SIGNAL(h) poll_event(h, POLLPRI)
#define EVENT_DETACHALL(e) { \
poll_leave(&(e)->polldesc); \
(e)->current = 0; \
}
#endif