diff options
author | dzwdz | 2022-04-10 16:05:22 +0200 |
---|---|---|
committer | dzwdz | 2022-04-10 16:05:22 +0200 |
commit | 1677ac032bb89f87456ac5668118f0091ae5ed9f (patch) | |
tree | a2319568e1c8ddc2a77c07ca9f0727efd721e435 | |
parent | 3e7d1acffd81175246fab1ed8be30569c9cd3289 (diff) |
init/fs: handle delegated reads in a subprocess
first off: this is horrible. there's no CoW, so this is horribly slow.
the sole purpose of this is to let the userland delegate handle multiple
requests at once, because i'm implementing concurrent IO and I kinda
need that.
it's possible that handling of multiple requests could be handled in a
better way - but this could be good enough once i implement CoW
-rw-r--r-- | src/init/fs/misc.c | 6 | ||||
-rw-r--r-- | src/kernel/proc.c | 2 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/init/fs/misc.c b/src/init/fs/misc.c index 2f02e09..dc14ac4 100644 --- a/src/init/fs/misc.c +++ b/src/init/fs/misc.c @@ -52,10 +52,16 @@ static void fs_respond_delegate(struct fs_wait_response *res, handle_t delegate, switch (res->op) { case VFSOP_READ: + if (_syscall_fork()) { + // handle reads in a child + // this is a HORRIBLE workaround for making concurrent IO work without proper delegates + break; + } // TODO instead of truncating the size, allocate a bigger buffer size = res->capacity < sizeof(buf) ? res->capacity : sizeof(buf); ret = _syscall_read(delegate, buf, size, res->offset); _syscall_fs_respond(buf, ret); + _syscall_exit(0); // TODO unreapable - add a nonblocking reap syscall break; // TODO proper writing (see above) diff --git a/src/kernel/proc.c b/src/kernel/proc.c index 8e94d24..cf5bb1e 100644 --- a/src/kernel/proc.c +++ b/src/kernel/proc.c @@ -54,6 +54,8 @@ struct process *process_fork(struct process *parent) { child->parent = parent; parent->child = child; + parent->handled_req = NULL; // TODO control this with a flag + child->id = next_pid++; return child; |