Add CPU ID lock
This commit is contained in:
parent
9836b3cb56
commit
221b4c0116
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue