Mutex -> RefCell in Processor.

This commit is contained in:
Yifan Wu 2021-02-15 16:42:51 +08:00
parent e769804090
commit a15a76edb9

View file

@ -1,13 +1,13 @@
use super::TaskControlBlock; use super::TaskControlBlock;
use alloc::sync::Arc; use alloc::sync::Arc;
use spin::Mutex; use core::cell::RefCell;
use lazy_static::*; use lazy_static::*;
use super::{fetch_task, TaskStatus}; use super::{fetch_task, TaskStatus};
use super::__switch; use super::__switch;
use crate::trap::TrapContext; use crate::trap::TrapContext;
pub struct Processor { pub struct Processor {
inner: Mutex<ProcessorInner>, inner: RefCell<ProcessorInner>,
} }
unsafe impl Sync for Processor {} unsafe impl Sync for Processor {}
@ -20,14 +20,14 @@ struct ProcessorInner {
impl Processor { impl Processor {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
inner: Mutex::new(ProcessorInner { inner: RefCell::new(ProcessorInner {
current: None, current: None,
idle_task_cx_ptr: 0, idle_task_cx_ptr: 0,
}), }),
} }
} }
fn get_idle_task_cx_ptr2(&self) -> *const usize { fn get_idle_task_cx_ptr2(&self) -> *const usize {
let inner = self.inner.lock(); let inner = self.inner.borrow();
&inner.idle_task_cx_ptr as *const usize &inner.idle_task_cx_ptr as *const usize
} }
pub fn run(&self) { pub fn run(&self) {
@ -38,7 +38,7 @@ impl Processor {
let next_task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); let next_task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2();
task.acquire_inner_lock().task_status = TaskStatus::Running; task.acquire_inner_lock().task_status = TaskStatus::Running;
// release // release
self.inner.lock().current = Some(task); self.inner.borrow_mut().current = Some(task);
unsafe { unsafe {
__switch( __switch(
idle_task_cx_ptr2, idle_task_cx_ptr2,
@ -49,10 +49,10 @@ impl Processor {
} }
} }
pub fn take_current(&self) -> Option<Arc<TaskControlBlock>> { pub fn take_current(&self) -> Option<Arc<TaskControlBlock>> {
self.inner.lock().current.take() self.inner.borrow_mut().current.take()
} }
pub fn current(&self) -> Option<Arc<TaskControlBlock>> { pub fn current(&self) -> Option<Arc<TaskControlBlock>> {
self.inner.lock().current.as_ref().map(|task| task.clone()) self.inner.borrow().current.as_ref().map(|task| task.clone())
} }
} }