RefCell->UPSafeCell

This commit is contained in:
Yifan Wu 2021-07-09 21:18:51 +08:00
parent 5a40784918
commit f1aabb5e0e
12 changed files with 65 additions and 22 deletions

View file

@ -4,16 +4,16 @@ mod task;
use crate::config::MAX_APP_NUM;
use crate::loader::{get_num_app, init_app_cx};
use core::cell::RefCell;
use lazy_static::*;
use switch::__switch;
use task::{TaskControlBlock, TaskStatus};
use crate::sync::UPSafeCell;
pub use context::TaskContext;
pub struct TaskManager {
num_app: usize,
inner: RefCell<TaskManagerInner>,
inner: UPSafeCell<TaskManagerInner>,
}
struct TaskManagerInner {
@ -21,8 +21,6 @@ struct TaskManagerInner {
current_task: usize,
}
unsafe impl Sync for TaskManager {}
lazy_static! {
pub static ref TASK_MANAGER: TaskManager = {
let num_app = get_num_app();
@ -36,18 +34,19 @@ lazy_static! {
}
TaskManager {
num_app,
inner: RefCell::new(TaskManagerInner {
inner: unsafe { UPSafeCell::new(TaskManagerInner {
tasks,
current_task: 0,
}),
})},
}
};
}
impl TaskManager {
fn run_first_task(&self) {
self.inner.borrow_mut().tasks[0].task_status = TaskStatus::Running;
let next_task_cx_ptr2 = self.inner.borrow().tasks[0].get_task_cx_ptr2();
let task0 = &mut self.inner.upsafe_access().tasks[0];
task0.task_status = TaskStatus::Running;
let next_task_cx_ptr2 = task0.get_task_cx_ptr2();
let _unused: usize = 0;
unsafe {
__switch(
@ -58,19 +57,19 @@ impl TaskManager {
}
fn mark_current_suspended(&self) {
let mut inner = self.inner.borrow_mut();
let mut inner = self.inner.upsafe_access();
let current = inner.current_task;
inner.tasks[current].task_status = TaskStatus::Ready;
}
fn mark_current_exited(&self) {
let mut inner = self.inner.borrow_mut();
let mut inner = self.inner.upsafe_access();
let current = inner.current_task;
inner.tasks[current].task_status = TaskStatus::Exited;
}
fn find_next_task(&self) -> Option<usize> {
let inner = self.inner.borrow();
let inner = self.inner.upsafe_access();
let current = inner.current_task;
(current + 1..current + self.num_app + 1)
.map(|id| id % self.num_app)
@ -81,7 +80,7 @@ impl TaskManager {
fn run_next_task(&self) {
if let Some(next) = self.find_next_task() {
let mut inner = self.inner.borrow_mut();
let mut inner = self.inner.upsafe_access();
let current = inner.current_task;
inner.tasks[next].task_status = TaskStatus::Running;
inner.current_task = next;