mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
pipefs: add proper poll support
This commit is contained in:
+10
-2
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user