diff --git a/kernel-src/fs/pipefs.c b/kernel-src/fs/pipefs.c index 450a1627..e8d260ae 100644 --- a/kernel-src/fs/pipefs.c +++ b/kernel-src/fs/pipefs.c @@ -75,10 +75,11 @@ int pipefs_open(vnode_t **node, int flags, cred_t *cred) { // and there are either no writers or no readers. eventlistener_t listener; EVENT_INITLISTENER(&listener); - if (flags & V_FFLAGS_READ) + if (flags & V_FFLAGS_READ) { EVENT_ATTACH(&listener, &pipenode->writeopenevent); - else + } else { EVENT_ATTACH(&listener, &pipenode->readopenevent); + } INTERNAL_UNLOCK(*node); error = EVENT_WAIT(&listener, 0); diff --git a/kernel-src/include/kernel/event.h b/kernel-src/include/kernel/event.h index 3ec97041..ec0f1dc2 100644 --- a/kernel-src/include/kernel/event.h +++ b/kernel-src/include/kernel/event.h @@ -4,22 +4,38 @@ #include typedef pollheader_t eventheader_t; +#define EVENT_MAX_ATTACHMENT 5 typedef struct { polldesc_t polldesc; - polldata_t polldata; + 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)->polldata.desc = &(e)->polldesc; \ + (e)->polldesc.data = (e)->polldata; \ + (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_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