From 71538efc061c8f920f80d53870b1ef19c1cc3d8f Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 5 Aug 2024 13:21:03 +0200 Subject: [PATCH] Allow thread exit to optionally deallocate stack. --- src/scheme/proc.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 0068edbde8..89b427ec45 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -1438,7 +1438,9 @@ impl ContextHandle { Ok(mem::size_of_val(&mask)) } ContextHandle::Status => { - let user_data = buf.read_usize()?; + let mut args = buf.usizes(); + + let user_data = args.next().ok_or(Error::new(EINVAL))??; if user_data != usize::MAX { // TODO: lwp_park/lwp_unpark? return Err(Error::new(EOPNOTSUPP)); @@ -1460,10 +1462,31 @@ impl ContextHandle { if is_current { crate::syscall::exit_this_context(); } else { - crate::syscall::wait_for_exit(context); + 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))??; - Ok(mem::size_of::()) + 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 { + Ok(mem::size_of::()) + } } ContextHandle::Signal => { let me = {