Switch Context::actions to RwLock
This commit is contained in:
@@ -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],
|
||||
|
||||
@@ -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]
|
||||
};
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user