From cde108439cda1a781eeabe3062f645633e98da1d Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Tue, 16 Jul 2024 13:05:10 +0200 Subject: [PATCH] Fix kill deadlock. --- Cargo.lock | 2 +- src/scheme/proc.rs | 13 +++++++++++-- src/syscall/process.rs | 5 ++++- syscall | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e7224f131..ca5e0dbab7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -226,7 +226,7 @@ checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7" [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" dependencies = [ "bitflags 2.4.2", ] diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index e6ecaf1509..2b2b9d47ed 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -1,7 +1,12 @@ use crate::{ arch::paging::{Page, RmmA, RmmArch, VirtualAddress}, context::{ - self, context::{HardBlockedReason, SignalState}, file::{FileDescriptor, InternalFlags}, memory::{handle_notify_files, AddrSpaceWrapper, Grant, PageSpan}, process::{self, Process, ProcessId, ProcessInfo}, Context, ContextRef, Status + self, + context::{HardBlockedReason, SignalState}, + file::{FileDescriptor, InternalFlags}, + memory::{handle_notify_files, AddrSpaceWrapper, Grant, PageSpan}, + process::{self, Process, ProcessId, ProcessInfo}, + Context, ContextRef, Status, }, memory::PAGE_SIZE, ptrace, @@ -1419,7 +1424,11 @@ impl ContextHandle { { let process = Arc::clone(&context.read().process); let mut process = process.write(); - if let Some(pos) = process.threads.iter().position(|p| Weak::as_ptr(p) == Arc::as_ptr(&context)) { + if let Some(pos) = process + .threads + .iter() + .position(|p| Weak::as_ptr(p) == Arc::as_ptr(&context)) + { process.threads.remove(pos); } } diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 32442fb98a..c3f29b1249 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -7,7 +7,9 @@ use rmm::Arch; use spin::RwLock; use crate::context::{ - memory::{AddrSpace, Grant, PageSpan}, process::{self, Process, ProcessId, ProcessInfo, ProcessStatus}, Context, ContextRef, WaitpidKey + memory::{AddrSpace, Grant, PageSpan}, + process::{self, Process, ProcessId, ProcessInfo, ProcessStatus}, + Context, ContextRef, WaitpidKey, }; use crate::{ @@ -234,6 +236,7 @@ pub fn kill(pid: ProcessId, sig: usize, parent_sigchld: bool) -> Result { pgid: proc_info.pgid, }; } + drop(process_guard); let mut context_guard = context_lock.write(); if sig == SIGSTOP || (matches!(sig, SIGTTIN | SIGTTOU | SIGTSTP) diff --git a/syscall b/syscall index 387f1c3326..6128f1acf0 160000 --- a/syscall +++ b/syscall @@ -1 +1 @@ -Subproject commit 387f1c332681a3cabe04294bce801e9c8c433df5 +Subproject commit 6128f1acf0f9be7d28a091c1bf8b05b73885d72e