mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 15:38:22 +00:00
event: support multiple attachments per event
This commit is contained in:
@@ -75,10 +75,11 @@ int pipefs_open(vnode_t **node, int flags, cred_t *cred) {
|
|||||||
// and there are either no writers or no readers.
|
// and there are either no writers or no readers.
|
||||||
eventlistener_t listener;
|
eventlistener_t listener;
|
||||||
EVENT_INITLISTENER(&listener);
|
EVENT_INITLISTENER(&listener);
|
||||||
if (flags & V_FFLAGS_READ)
|
if (flags & V_FFLAGS_READ) {
|
||||||
EVENT_ATTACH(&listener, &pipenode->writeopenevent);
|
EVENT_ATTACH(&listener, &pipenode->writeopenevent);
|
||||||
else
|
} else {
|
||||||
EVENT_ATTACH(&listener, &pipenode->readopenevent);
|
EVENT_ATTACH(&listener, &pipenode->readopenevent);
|
||||||
|
}
|
||||||
|
|
||||||
INTERNAL_UNLOCK(*node);
|
INTERNAL_UNLOCK(*node);
|
||||||
error = EVENT_WAIT(&listener, 0);
|
error = EVENT_WAIT(&listener, 0);
|
||||||
|
|||||||
@@ -4,22 +4,38 @@
|
|||||||
#include <kernel/poll.h>
|
#include <kernel/poll.h>
|
||||||
|
|
||||||
typedef pollheader_t eventheader_t;
|
typedef pollheader_t eventheader_t;
|
||||||
|
#define EVENT_MAX_ATTACHMENT 5
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
polldesc_t polldesc;
|
polldesc_t polldesc;
|
||||||
polldata_t polldata;
|
polldata_t polldata[EVENT_MAX_ATTACHMENT];
|
||||||
|
int current;
|
||||||
} eventlistener_t;
|
} eventlistener_t;
|
||||||
|
|
||||||
#define EVENT_INITHEADER(e) POLL_INITHEADER(e)
|
#define EVENT_INITHEADER(e) POLL_INITHEADER(e)
|
||||||
#define EVENT_INITLISTENER(e) { \
|
#define EVENT_INITLISTENER(e) { \
|
||||||
poll_initdesc(&(e)->polldesc, 0); \
|
poll_initdesc(&(e)->polldesc, 0); \
|
||||||
(e)->polldesc.data = &(e)->polldata; \
|
(e)->polldesc.data = (e)->polldata; \
|
||||||
(e)->polldata.desc = &(e)->polldesc; \
|
(e)->current = 0; \
|
||||||
|
for (int i = 0; i < EVENT_MAX_ATTACHMENT; ++i) \
|
||||||
|
(e)->polldata[i].desc = &(e)->polldesc; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EVENT_ATTACH(e, h) { \
|
||||||
|
poll_add(h, &(e)->polldata[(e)->current++], POLLPRI); \
|
||||||
|
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(""); \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EVENT_ATTACH(e, h) poll_add(h, &(e)->polldata, POLLPRI)
|
|
||||||
#define EVENT_WAIT(e, t) poll_dowait(&(e)->polldesc, t)
|
#define EVENT_WAIT(e, t) poll_dowait(&(e)->polldesc, t)
|
||||||
#define EVENT_SIGNAL(h) poll_event(h, POLLPRI)
|
#define EVENT_SIGNAL(h) poll_event(h, POLLPRI)
|
||||||
#define EVENT_DETACHALL(e) poll_leave(&(e)->polldesc)
|
|
||||||
|
#define EVENT_DETACHALL(e) { \
|
||||||
|
poll_leave(&(e)->polldesc); \
|
||||||
|
(e)->current = 0; \
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user