summaryrefslogtreecommitdiff
path: root/kernel/halts.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/halts.c')
-rw-r--r--kernel/halts.c105
1 files changed, 22 insertions, 83 deletions
diff --git a/kernel/halts.c b/kernel/halts.c
index 6f60a79..c2b682e 100644
--- a/kernel/halts.c
+++ b/kernel/halts.c
@@ -2,98 +2,37 @@
#include <halts.h>
#include <sched/scheduler.h>
-int create_disconnect_inode_halt(vfs_inode_t *inode) {
- volatile process_t *p = get_current_task();
- int i;
- for (i = 0; i < 100; i++)
- if (!p->disconnect_halt_inode[i])
- break;
-
- if (p->disconnect_halt_inode[i])
- return -1;
-
- p->disconnect_halt_inode[i] = inode;
- return i;
-}
-
-int create_disconnect_fdhalt(vfs_fd_t *fd) {
- assert(fd);
- return create_disconnect_inode_halt(fd->inode);
-}
-
-int create_read_inode_halt(vfs_inode_t *inode) {
- volatile process_t *p = get_current_task();
- int i;
- for (i = 0; i < 100; i++)
- if (!p->read_halt_inode[i])
- break;
-
- if (p->read_halt_inode[i])
- return -1;
-
- p->read_halt_inode[i] = inode;
-
- return i;
-}
-
-int create_read_fdhalt(vfs_fd_t *fd) {
- assert(fd);
- return create_read_inode_halt(fd->inode);
-}
-
-int create_write_inode_halt(vfs_inode_t *inode) {
- volatile process_t *p = get_current_task();
- int i;
- for (i = 0; i < 100; i++)
- if (!p->write_halt_inode[i])
- break;
-
- if (p->write_halt_inode[i])
- return -1;
-
- p->write_halt_inode[i] = inode;
- return i;
-}
-
-int create_write_fdhalt(vfs_fd_t *fd) {
- return create_write_inode_halt(fd->inode);
-}
-
-void unset_read_fdhalt(int i) {
- get_current_task()->read_halt_inode[i] = NULL;
-}
-
-void unset_write_fdhalt(int i) {
- get_current_task()->write_halt_inode[i] = NULL;
-}
-
-void unset_disconnect_fdhalt(int i) {
- get_current_task()->disconnect_halt_inode[i] = NULL;
-}
-
-int isset_fdhalt(vfs_inode_t *read_halts[], vfs_inode_t *write_halts[],
- vfs_inode_t *disconnect_halts[]) {
+int isset_fdhalt(process_t *p) {
int blocked = 0;
- for (int i = 0; i < 100; i++) {
- if (!read_halts[i])
- continue;
- if (read_halts[i]->has_data) {
+ struct list *read_list = &p->read_list;
+ for (int i = 0;; i++) {
+ vfs_inode_t *inode;
+ if (!list_get(read_list, i, (void **)&inode)) {
+ break;
+ }
+ if (inode->has_data) {
return 0;
}
blocked = 1;
}
- for (int i = 0; i < 100; i++) {
- if (!write_halts[i])
- continue;
- if (write_halts[i]->can_write) {
+ struct list *write_list = &p->write_list;
+ for (int i = 0;; i++) {
+ vfs_inode_t *inode;
+ if (!list_get(write_list, i, (void **)&inode)) {
+ break;
+ }
+ if (inode->can_write) {
return 0;
}
blocked = 1;
}
- for (int i = 0; i < 100; i++) {
- if (!disconnect_halts[i])
- continue;
- if (!disconnect_halts[i]->is_open) {
+ struct list *disconnect_list = &p->disconnect_list;
+ for (int i = 0;; i++) {
+ vfs_inode_t *inode;
+ if (!list_get(disconnect_list, i, (void **)&inode)) {
+ break;
+ }
+ if (inode->is_open) {
return 0;
}
blocked = 1;