diff --git a/src/context/context.rs b/src/context/context.rs index fccd6b0ec5d2357ad9ee1161a147b0db7521f4c3..5926a16f840daf415d7506324274adede3f9a1ab 100644 --- a/src/context/context.rs +++ b/src/context/context.rs @@ -241,7 +241,7 @@ pub struct Context { /// The open files in the scheme pub files: Arc<RwLock<Vec<Option<FileDescriptor>>>>, /// Signal actions - pub actions: Arc<Mutex<Vec<(SigAction, usize)>>>, + pub actions: Arc<RwLock<Vec<(SigAction, usize)>>>, /// The pointer to the user-space registers, saved after certain /// interrupts. This pointer is somewhere inside kstack, and the /// kstack address at the time of creation is the first element in @@ -295,7 +295,7 @@ impl Context { name: Arc::new(RwLock::new(String::new().into_boxed_str())), cwd: Arc::new(RwLock::new(Vec::new())), files: Arc::new(RwLock::new(Vec::new())), - actions: Arc::new(Mutex::new(vec![( + actions: Arc::new(RwLock::new(vec![( SigAction { sa_handler: unsafe { mem::transmute(SIG_DFL) }, sa_mask: [0; 2], diff --git a/src/context/signal.rs b/src/context/signal.rs index 05d3ff749467360a3bc44136ad9591d318839502..bc5add17f5c893380f94a1b50afe86a65ba649ed 100644 --- a/src/context/signal.rs +++ b/src/context/signal.rs @@ -17,7 +17,7 @@ pub extern "C" fn signal_handler(sig: usize) { let contexts = contexts(); let context_lock = contexts.current().expect("context::signal_handler not inside of context"); let context = context_lock.read(); - let actions = context.actions.lock(); + let actions = context.actions.read(); actions[sig] }; diff --git a/src/ptrace.rs b/src/ptrace.rs index aeea28f2114abcb081101b40190673ce1bcef8ac..6f0e741639acdd312f0d7c23c3c80e90bbb8e763 100644 --- a/src/ptrace.rs +++ b/src/ptrace.rs @@ -404,7 +404,7 @@ pub unsafe fn regs_for(context: &Context) -> Option<&InterruptStack> { None => None, Some((_, _, ref kstack, signum)) => { let is_user_handled = { - let actions = context.actions.lock(); + let actions = context.actions.read(); signal::is_user_handled(actions[signum as usize].0.sa_handler) }; if is_user_handled { @@ -425,7 +425,7 @@ pub unsafe fn regs_for_mut(context: &mut Context) -> Option<&mut InterruptStack> None => None, Some((_, _, ref mut kstack, signum)) => { let is_user_handled = { - let actions = context.actions.lock(); + let actions = context.actions.read(); signal::is_user_handled(actions[signum as usize].0.sa_handler) }; if is_user_handled { diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 262ffff99f66d539e3a44d4f6a44020aa7bde3d3..94d3766f896235fe8d067b9a8759f2b8c3f69f34 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -265,7 +265,7 @@ pub fn clone(flags: CloneFlags, stack_base: usize) -> Result<ContextId> { if flags.contains(CLONE_SIGHAND) { actions = Arc::clone(&context.actions); } else { - actions = Arc::new(Mutex::new(context.actions.lock().clone())); + actions = Arc::new(RwLock::new(context.actions.read().clone())); } } @@ -849,7 +849,7 @@ fn fexec_noreturn( drop(args); drop(vars); - context.actions = Arc::new(Mutex::new(vec![( + context.actions = Arc::new(RwLock::new(vec![( SigAction { sa_handler: unsafe { mem::transmute(SIG_DFL) }, sa_mask: [0; 2], @@ -1414,7 +1414,7 @@ pub fn sigaction(sig: usize, act_opt: Option<&SigAction>, oldact_opt: Option<&mu let contexts = context::contexts(); let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; let context = context_lock.read(); - let mut actions = context.actions.lock(); + let mut actions = context.actions.write(); if let Some(oldact) = oldact_opt { *oldact = actions[sig].0;