diff options
Diffstat (limited to 'kernel/halts.c')
-rw-r--r-- | kernel/halts.c | 105 |
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; |