mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +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);
|
*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->writeevent);
|
||||||
|
}
|
||||||
|
|
||||||
event_signal(&pipenode->readevent);
|
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);
|
*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->readevent);
|
||||||
|
}
|
||||||
|
|
||||||
event_signal(&pipenode->writeevent);
|
event_signal(&pipenode->writeevent);
|
||||||
|
|
||||||
@@ -167,6 +171,9 @@ int pipefs_poll(vnode_t *node, polldata_t *data, int events) {
|
|||||||
revents |= POLLOUT;
|
revents |= POLLOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (revents == 0 && data)
|
||||||
|
poll_add(&pipenode->pollheader, data, events);
|
||||||
|
|
||||||
VOP_UNLOCK(node);
|
VOP_UNLOCK(node);
|
||||||
return revents;
|
return revents;
|
||||||
}
|
}
|
||||||
@@ -238,6 +245,7 @@ static void ctor(scache_t *cache, void *obj) {
|
|||||||
node->attr.inode = ++currentinode;
|
node->attr.inode = ++currentinode;
|
||||||
EVENT_INIT(&node->writeevent);
|
EVENT_INIT(&node->writeevent);
|
||||||
EVENT_INIT(&node->readevent);
|
EVENT_INIT(&node->readevent);
|
||||||
|
POLL_INITHEADER(&node->pollheader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pipefs_init() {
|
void pipefs_init() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <ringbuffer.h>
|
#include <ringbuffer.h>
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
#include <event.h>
|
#include <event.h>
|
||||||
|
#include <kernel/poll.h>
|
||||||
|
|
||||||
typedef struct pipenode_t {
|
typedef struct pipenode_t {
|
||||||
vnode_t vnode;
|
vnode_t vnode;
|
||||||
@@ -12,6 +13,7 @@ typedef struct pipenode_t {
|
|||||||
ringbuffer_t data;
|
ringbuffer_t data;
|
||||||
size_t readers, writers;
|
size_t readers, writers;
|
||||||
event_t readevent, writeevent;
|
event_t readevent, writeevent;
|
||||||
|
pollheader_t pollheader;
|
||||||
} pipenode_t;
|
} pipenode_t;
|
||||||
|
|
||||||
void pipefs_init();
|
void pipefs_init();
|
||||||
|
|||||||
Reference in New Issue
Block a user