diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs index a01e8c63e7b92b85c89c98273d2703bcd6da21b0..62e2385d9a8c8bb5f4054aa423462ec0a640aa73 100644 --- a/src/platform/redox/clone.rs +++ b/src/platform/redox/clone.rs @@ -228,6 +228,12 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { // Unblock context. syscall::kill(new_pid, SIGCONT)?; + // XXX: Killing with SIGCONT will put (pid, 65536) at key (pid, pgid) into the waitpid of this + // context. This means that if pgid is changed (as it is in ion for example), the pgid message + // in syscall::exit() will not be inserted as the key comparator thinks they're equal as their + // PIDs are. So, we have to call this to clear the waitpid queue to prevent deadlocks. + let _ = syscall::waitpid(new_pid, &mut 0, syscall::WUNTRACED | syscall::WCONTINUED); + Ok(new_pid) } #[no_mangle]