From 7b06ca16b1d69ebfbbac8087e96824b317eca849 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Wed, 26 Feb 2025 23:54:14 +0100 Subject: [PATCH] Make thread kill API async. --- src/scheme/proc.rs | 46 +++++++++++++++++++++--------------------- src/syscall/process.rs | 11 ---------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 6ae144362c..ef885e8b63 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -990,31 +990,31 @@ impl ContextHandle { let is_current = context::is_current(&context); if is_current { + // The following functionality simplifies the cleanup step when detached threads + // terminate. + if let Some(post_unmap) = args.next() { + let base = post_unmap?; + let size = args.next().ok_or(Error::new(EINVAL))??; + + if size == 0 { + return Ok(3 * mem::size_of::()); + } + + let addrsp = Arc::clone(context.read().addr_space()?); + let res = addrsp.munmap( + PageSpan::validate_nonempty(VirtualAddress::new(base), size) + .ok_or(Error::new(EINVAL))?, + false, + )?; + for r in res { + let _ = r.unmap(); + } + } crate::syscall::exit_this_context(); } else { - crate::syscall::wait_for_exit(Arc::clone(&context)); - } - // The following functionality simplifies the cleanup step when detached threads - // terminate. - if let Some(post_unmap) = args.next() { - let base = post_unmap?; - let size = args.next().ok_or(Error::new(EINVAL))??; - - if size == 0 { - return Ok(3 * mem::size_of::()); - } - - let addrsp = Arc::clone(context.read().addr_space()?); - let res = addrsp.munmap( - PageSpan::validate_nonempty(VirtualAddress::new(base), size) - .ok_or(Error::new(EINVAL))?, - false, - )?; - for r in res { - let _ = r.unmap(); - } - Ok(3 * mem::size_of::()) - } else { + let mut ctxt = context.write(); + ctxt.status = context::Status::Runnable; + ctxt.being_sigkilled = true; Ok(mem::size_of::()) } } diff --git a/src/syscall/process.rs b/src/syscall/process.rs index f89ab10453..fa4443cdc9 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -69,17 +69,6 @@ pub fn exit_this_context() -> ! { unreachable!(); } -pub fn wait_for_exit(context_lock: Arc>) { - { - let mut ctxt = context_lock.write(); - ctxt.status = context::Status::Runnable; - ctxt.being_sigkilled = true; - } - while !matches!(context_lock.read().status, context::Status::Dead) { - context::switch(); - } -} - pub fn send_signal( context: Arc>, sig: usize,