diff --git a/kernel/context/context.rs b/kernel/context/context.rs index fd51e96..c280dae 100644 --- a/kernel/context/context.rs +++ b/kernel/context/context.rs @@ -35,6 +35,8 @@ pub struct Context { pub status: Status, /// Context running or not pub running: bool, + /// CPU ID, if locked + pub cpuid: Option, /// Context is halting parent pub vfork: bool, /// Context is being waited on @@ -79,6 +81,7 @@ impl Context { egid: 0, status: Status::Blocked, running: false, + cpuid: None, vfork: false, waitpid: Arc::new(WaitCondition::new()), wake: None, diff --git a/kernel/context/mod.rs b/kernel/context/mod.rs index 9da1259..882eb6c 100644 --- a/kernel/context/mod.rs +++ b/kernel/context/mod.rs @@ -50,6 +50,7 @@ pub fn init() { context.kfx = Some(fx); context.status = Status::Runnable; context.running = true; + context.cpuid = Some(::cpu_id()); CONTEXT_ID.store(context.id, Ordering::SeqCst); } diff --git a/kernel/context/switch.rs b/kernel/context/switch.rs index 0e291e6..ccc5176 100644 --- a/kernel/context/switch.rs +++ b/kernel/context/switch.rs @@ -27,20 +27,22 @@ pub unsafe fn switch() -> bool { } let check_context = |context: &mut Context| -> bool { - if context.status == Status::Blocked && context.wake.is_some() { - let wake = context.wake.expect("context::switch: wake not set"); + if context.cpuid == None || context.cpuid == Some(::cpu_id()) { + if context.status == Status::Blocked && context.wake.is_some() { + let wake = context.wake.expect("context::switch: wake not set"); - let current = arch::time::monotonic(); - if current.0 > wake.0 || (current.0 == wake.0 && current.1 >= wake.1) { - context.unblock(); + let current = arch::time::monotonic(); + if current.0 > wake.0 || (current.0 == wake.0 && current.1 >= wake.1) { + context.unblock(); + } + } + + if context.status == Status::Runnable && ! context.running { + return true; } } - if context.status == Status::Runnable && ! context.running { - true - } else { - false - } + false }; for (pid, context_lock) in contexts.iter() { @@ -72,7 +74,7 @@ pub unsafe fn switch() -> bool { return false; } - //println!("Switch {} to {}", (&*from_ptr).id, (&*to_ptr).id); + // println!("{}: Switch {} to {}", ::cpu_id(), (&*from_ptr).id, (&*to_ptr).id); (&mut *from_ptr).running = false; (&mut *to_ptr).running = true;