change shared-scheduler return type
This commit is contained in:
parent
a24a2ee563
commit
9e2cd977ae
|
@ -13,7 +13,7 @@ pub enum TaskResult {
|
|||
/// 应当立即执行特定任务
|
||||
Task(SharedTaskHandle),
|
||||
/// 其他地址空间的任务要运行,应当让出时间片
|
||||
ShouldYield,
|
||||
ShouldYield(usize),
|
||||
/// 队列已空,所有任务已经结束
|
||||
Finished
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ pub enum TaskResult {
|
|||
/// 应当立即执行特定任务
|
||||
Task(SharedTaskHandle),
|
||||
/// 其它地址空间的任务要运行,应当让出时间片
|
||||
ShouldYield,
|
||||
ShouldYield(usize),
|
||||
/// 队列已空,所有任务已经结束
|
||||
Finished,
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ pub enum TaskResult {
|
|||
/// 应当立即执行特定任务
|
||||
Task(SharedTaskHandle),
|
||||
/// 其它地址空间的任务要运行,应当让出时间片
|
||||
ShouldYield,
|
||||
ShouldYield(usize),
|
||||
/// 队列已空,所有任务已经结束
|
||||
Finished,
|
||||
}
|
Loading…
Reference in New Issue