summaryrefslogtreecommitdiff
path: root/kernel/poll.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-02-19 18:52:30 +0100
committerAnton Kling <anton@kling.gg>2024-02-19 18:52:30 +0100
commit239e33019117f4ab59dd26550d7969e45c290166 (patch)
treede180effd804573d07acf8ac495fa7defc1edd70 /kernel/poll.c
parent61c443579150a4714c132ecb1ac18779535f91c9 (diff)
Kernel/VFS: Cleanup of file descriptor halts
Diffstat (limited to 'kernel/poll.c')
-rw-r--r--kernel/poll.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/kernel/poll.c b/kernel/poll.c
index 7e9c8e8..0452bc8 100644
--- a/kernel/poll.c
+++ b/kernel/poll.c
@@ -1,14 +1,19 @@
#include <fs/vfs.h>
#include <halts.h>
+#include <interrupts.h>
+#include <lib/list.h>
#include <poll.h>
#include <sched/scheduler.h>
int poll(struct pollfd *fds, size_t nfds, int timeout) {
(void)timeout;
int rc = 0;
- int read_locks[nfds];
- int write_locks[nfds];
- int disconnect_locks[nfds];
+
+ disable_interrupts();
+
+ struct list *read_list = &get_current_task()->read_list;
+ struct list *write_list = &get_current_task()->write_list;
+ struct list *disconnect_list = &get_current_task()->disconnect_list;
for (size_t i = 0; i < nfds; i++) {
if (fds[i].fd < 0)
continue;
@@ -16,26 +21,25 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
if (NULL == f) {
continue;
}
- if (fds[i].events & POLLIN)
- read_locks[i] = create_read_fdhalt(f);
- if (fds[i].events & POLLOUT)
- write_locks[i] = create_write_fdhalt(f);
- if (fds[i].events & POLLHUP)
- disconnect_locks[i] = create_disconnect_fdhalt(f);
+
+ if (fds[i].events & POLLIN) {
+ list_add(read_list, f->inode);
+ }
+ if (fds[i].events & POLLOUT) {
+ list_add(write_list, f->inode);
+ }
+ if (fds[i].events & POLLHUP) {
+ list_add(disconnect_list, f->inode);
+ }
}
switch_task();
+ disable_interrupts();
+
+ list_reset(read_list);
+ list_reset(write_list);
+ list_reset(disconnect_list);
- for (size_t i = 0; i < nfds; i++) {
- if (fds[i].fd < 0)
- continue;
- if (fds[i].events & POLLIN)
- unset_read_fdhalt(read_locks[i]);
- if (fds[i].events & POLLOUT)
- unset_write_fdhalt(write_locks[i]);
- if (fds[i].events & POLLHUP)
- unset_disconnect_fdhalt(disconnect_locks[i]);
- }
for (size_t i = 0; i < nfds; i++) {
if (0 > fds[i].fd) {
fds[i].revents = 0;
@@ -56,5 +60,6 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
rc++;
}
}
+ enable_interrupts();
return rc;
}