diff options
author | dzwdz | 2023-08-29 23:35:03 +0200 |
---|---|---|
committer | dzwdz | 2023-08-29 23:35:03 +0200 |
commit | f71af249cfb9ca9eb0832cc46437b2c5cb7bb217 (patch) | |
tree | dcc5403d304547da397644b9d43e2bf8c67a0b3e /src/kernel | |
parent | dd385a413c92d53a1f792011e1029d7d68e19c6c (diff) |
kernel: remove _sys_await, emulate it in libc
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/proc.c | 18 | ||||
-rw-r--r-- | src/kernel/proc.h | 1 | ||||
-rw-r--r-- | src/kernel/syscalls.c | 26 |
3 files changed, 7 insertions, 38 deletions
diff --git a/src/kernel/proc.c b/src/kernel/proc.c index cd9db9b..bbf939c 100644 --- a/src/kernel/proc.c +++ b/src/kernel/proc.c @@ -353,17 +353,13 @@ void proc_tryreap(Proc *dead) { if (parent->awaited_death.pid && parent->awaited_death.pid != pid) { return; /* we're not The One */ } - if (parent->awaited_death.legacy) { - regs_savereturn(&parent->regs, dead->death_msg); - } else { - regs_savereturn(&parent->regs, pid); - if (parent->awaited_death.out) { - struct sys_wait2 __user *out = parent->awaited_death.out; - struct sys_wait2 data; - memset(&data, 0, sizeof data); - data.status = dead->death_msg; - pcpy_to(parent, out, &data, sizeof data); - } + regs_savereturn(&parent->regs, pid); + if (parent->awaited_death.out) { + struct sys_wait2 __user *out = parent->awaited_death.out; + struct sys_wait2 data; + memset(&data, 0, sizeof data); + data.status = dead->death_msg; + pcpy_to(parent, out, &data, sizeof data); } proc_setstate(parent, PS_RUNNING); } diff --git a/src/kernel/proc.h b/src/kernel/proc.h index afa4439..0dffe08 100644 --- a/src/kernel/proc.h +++ b/src/kernel/proc.h @@ -45,7 +45,6 @@ struct Proc { union { /* saved value, meaning depends on .state */ int death_msg; // PS_DEAD struct { - bool legacy; /* false = wait2, true = await */ uint32_t pid; /* valid if nonzero */ struct sys_wait2 __user *out; } awaited_death; diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index a8b47ae..0dda320 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -22,30 +22,6 @@ _Noreturn void _sys_exit(long ret) { proc_switch_any(); } -long _sys_await(void) { - bool has_children = false; - proc_setstate(proc_cur, PS_WAITS4CHILDDEATH); - proc_cur->awaited_death.legacy = true; - proc_cur->awaited_death.pid = 0; - - for (Proc *iter = proc_cur->child; - iter; iter = iter->sibling) - { - if (iter->noreap) continue; - has_children = true; - if (iter->state == PS_TOREAP) { - proc_tryreap(iter); - return 0; // dummy - } - } - - if (!has_children) { - proc_setstate(proc_cur, PS_RUNNING); - SYSCALL_RETURN(~0); // TODO errno - } - return 0; // dummy -} - long _sys_fork(int flags, hid_t __user *fs_front) { Proc *child; @@ -410,7 +386,6 @@ int _sys_wait2(int pid, int flags, struct sys_wait2 __user *out) { bool has_children = false; proc_setstate(proc_cur, PS_WAITS4CHILDDEATH); - proc_cur->awaited_death.legacy = false; proc_cur->awaited_death.out = out; proc_cur->awaited_death.pid = (0 < pid) ? pid : 0; @@ -463,7 +438,6 @@ long _syscall(long num, long a, long b, long c, long d, long e) { * see execbuf */ switch (num) { break; case _SYS_EXIT: _sys_exit(a); - break; case _SYS_AWAIT: _sys_await(); break; case _SYS_FORK: _sys_fork(a, (userptr_t)b); break; case _SYS_OPEN: _sys_open((userptr_t)a, b, c); break; case _SYS_MOUNT: _sys_mount(a, (userptr_t)b, c); |