diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 20e5d98986..76d25b8f8d 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -1095,29 +1095,33 @@ impl ContextHandle { } ContextVerb::ForceKill => { if context::is_current(&context) { + //log::trace!("FORCEKILL SELF {} {}", context.read().debug_id, context.read().pid); + // 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) + if size > 0 { + 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(); + false, + )?; + for r in res { + let _ = r.unmap(); + } } } crate::syscall::exit_this_context(); } else { let mut ctxt = context.write(); + //log::trace!("FORCEKILL NONSELF={} {}, SELF={}", ctxt.debug_id, ctxt.pid, context::current().read().debug_id); ctxt.status = context::Status::Runnable; ctxt.being_sigkilled = true; Ok(mem::size_of::())