change shared-scheduler return type

This commit is contained in:
SKTT1Ryze 2021-04-18 20:13:11 +08:00
parent a24a2ee563
commit 9e2cd977ae
8 changed files with 15 additions and 27 deletions

View File

@ -13,7 +13,7 @@ pub enum TaskResult {
/// 应当立即执行特定任务
Task(SharedTaskHandle),
/// 其他地址空间的任务要运行,应当让出时间片
ShouldYield,
ShouldYield(usize),
/// 队列已空,所有任务已经结束
Finished
}

View File

@ -62,16 +62,6 @@ pub struct SharedTaskHandle {
pub(crate) task_ptr: usize,
}
// impl SharedTaskHandle {
// pub fn new(hart_id: usize, asid: usize, task_ptr: usize) -> Self {
// Self {
// hart_id,
// address_space_id: unsafe { AddressSpaceId::from_raw(asid) },
// task_ptr
// }
// }
// }
/// 给共享调度器添加任务
///
/// 在内核态和用户态都可以调用
@ -100,8 +90,8 @@ pub unsafe fn shared_pop_task(
let mut scheduler = s.as_mut().lock();
if let Some(task) = scheduler.peek_next_task() {
if should_switch(task) {
// 如果需要跳转到其他地址空间,则不弹出任务,给出信
return TaskResult::ShouldYield
// 如果需要跳转到其他地址空间,则不弹出任务,返回需要跳转到的地址空间编
return TaskResult::ShouldYield(task.address_space_id.into_inner())
}
// 从共享调度器弹出任务交给调用者
let next_task = scheduler.next_task().unwrap();

View File

@ -136,13 +136,13 @@ pub extern "C" fn rust_main(hart_id: usize) -> ! {
unsafe {
shared_add_task(shared_scheduler, task_1.shared_task_handle());
shared_add_task(shared_scheduler, task_2.shared_task_handle());
// shared_add_task(shared_scheduler, task_3.shared_task_handle());
shared_add_task(shared_scheduler, task_3.shared_task_handle());
}
// task::run_until_idle(
// || unsafe { shared_pop_task(shared_scheduler, task::SharedTaskHandle::should_switch) },
// |handle| unsafe { shared_add_task(shared_scheduler, handle) }
// );
task::run_until_idle(
|| unsafe { shared_pop_task(shared_scheduler, task::SharedTaskHandle::should_switch) },
|handle| unsafe { shared_add_task(shared_scheduler, handle) }
);
// 进入用户态
user::first_enter_user(stack_handle.end.0 - 4)

View File

@ -38,7 +38,6 @@ pub fn syscall(param: [usize; 2], func: usize, module: usize) -> SyscallResult {
/// 从共享调度器里面拿出下一个任务的引用,根据地址空间编号切换到相应的地址空间
/// 下一个任务的地址空间编号由用户通过 a0 参数传给内核
fn switch_next_task(param: [usize; 2], func: usize) -> SyscallResult {
println!("switch next task: {}", param[0]);
let next_asid = unsafe { AddressSpaceId::from_raw(param[0]) }; // a0
if next_asid.into_inner() == 0 {
// 内核任务,这里为了测试,不执行,直接回到用户态
@ -57,7 +56,6 @@ fn switch_next_task(param: [usize; 2], func: usize) -> SyscallResult {
core::mem::transmute(shared_pop_task_ptr)
};
unsafe { shared_pop_task(shared_scheduler, crate::task::SharedTaskHandle::should_switch); }
println!("run here");
return SyscallResult::Procceed{ code: 0, extra: 0};
}
if let Some(next_satp) = KernelHartInfo::get_satp(next_asid) {

View File

@ -42,9 +42,9 @@ where
push_task(handle);
} // 否则释放task的内存。这里相当于drop(task)
},
TaskResult::ShouldYield => {
//todo
// crate::trap::switch_to_user()
TaskResult::ShouldYield(next_asid) => {
// todo: 切换到 next_asid 对应的地址空间
todo!()
},
TaskResult::Finished => break
}

View File

@ -20,7 +20,7 @@ pub enum TaskResult {
/// 应当立即执行特定任务
Task(SharedTaskHandle),
/// 其它地址空间的任务要运行,应当让出时间片
ShouldYield,
ShouldYield(usize),
/// 队列已空,所有任务已经结束
Finished,
}

View File

@ -78,9 +78,9 @@ where
push_task(handle);
}
},
TaskResult::ShouldYield => {
TaskResult::ShouldYield(next_asid) => {
// 让出操作
do_yield(0);
do_yield(next_asid);
},
TaskResult::Finished => return None
}

View File

@ -114,7 +114,7 @@ pub enum TaskResult {
/// 应当立即执行特定任务
Task(SharedTaskHandle),
/// 其它地址空间的任务要运行,应当让出时间片
ShouldYield,
ShouldYield(usize),
/// 队列已空,所有任务已经结束
Finished,
}