diff --git a/context/context.rs b/context/context.rs index fd51e969ddea48f04902c1ace7d99b0599f0008f..c280dae523e4cd800063ffb32a578233dd49def9 100644 --- a/context/context.rs +++ b/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<usize>, /// 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/context/mod.rs b/context/mod.rs index 9da1259c1746e687a227ff72857e66dc215f3cc7..882eb6c9845d220472582389244dbd9a488adacd 100644 --- a/context/mod.rs +++ b/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/context/switch.rs b/context/switch.rs index 0e291e6196f19a2d267f6bc9d652ed053887ede2..ccc517671144e152a7934a996cba3078e5296496 100644 --- a/context/switch.rs +++ b/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 { - true - } else { - false + if context.status == Status::Runnable && ! context.running { + return true; + } } + + 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;