Switch Context::actions to RwLock

This commit is contained in:
Jeremy Soller
2021-02-13 13:01:20 -07:00
parent 83dea72a50
commit 41bea0086f
4 changed files with 8 additions and 8 deletions

View File

@@ -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],

View File

@@ -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]
};

View File

@@ -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 {

View File

@@ -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;