pipefs: add proper poll support

This commit is contained in:
Matheus
2023-09-07 15:49:42 -03:00
parent 832deafb60
commit 35fe8f2d6b
2 changed files with 12 additions and 2 deletions
+10 -2
View File
@@ -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() {
+2
View File
@@ -5,6 +5,7 @@
#include <ringbuffer.h>
#include <semaphore.h>
#include <event.h>
#include <kernel/poll.h>
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();