From 35fe8f2d6ba4d8e86be41edcfb639f6589a234c9 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 7 Sep 2023 15:49:42 -0300 Subject: [PATCH] pipefs: add proper poll support --- kernel-src/fs/pipefs.c | 12 ++++++++++-- kernel-src/include/kernel/pipefs.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel-src/fs/pipefs.c b/kernel-src/fs/pipefs.c index 3ac86aed..a9d36fe8 100644 --- a/kernel-src/fs/pipefs.c +++ b/kernel-src/fs/pipefs.c @@ -90,8 +90,10 @@ int pipefs_read(vnode_t *node, void *buffer, size_t size, uintmax_t offset, int *readc = ringbuffer_read(&pipenode->data, buffer, size); - if (*readc < datacount) + if (*readc < datacount) { + poll_event(&pipenode->pollheader, POLLOUT); event_signal(&pipenode->writeevent); + } event_signal(&pipenode->readevent); @@ -138,8 +140,10 @@ int pipefs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offset, int *writec = ringbuffer_write(&pipenode->data, buffer, size); - if (datacount + *writec < BUFFER_SIZE) + if (datacount + *writec < BUFFER_SIZE) { + poll_event(&pipenode->pollheader, POLLIN); event_signal(&pipenode->readevent); + } event_signal(&pipenode->writeevent); @@ -167,6 +171,9 @@ int pipefs_poll(vnode_t *node, polldata_t *data, int events) { revents |= POLLOUT; } + if (revents == 0 && data) + poll_add(&pipenode->pollheader, data, events); + VOP_UNLOCK(node); return revents; } @@ -238,6 +245,7 @@ static void ctor(scache_t *cache, void *obj) { node->attr.inode = ++currentinode; EVENT_INIT(&node->writeevent); EVENT_INIT(&node->readevent); + POLL_INITHEADER(&node->pollheader); } void pipefs_init() { diff --git a/kernel-src/include/kernel/pipefs.h b/kernel-src/include/kernel/pipefs.h index 3a94cb86..8a654e73 100644 --- a/kernel-src/include/kernel/pipefs.h +++ b/kernel-src/include/kernel/pipefs.h @@ -5,6 +5,7 @@ #include #include #include +#include typedef struct pipenode_t { vnode_t vnode; @@ -12,6 +13,7 @@ typedef struct pipenode_t { ringbuffer_t data; size_t readers, writers; event_t readevent, writeevent; + pollheader_t pollheader; } pipenode_t; void pipefs_init();