small fix
This commit is contained in:
parent
5cfdb5e975
commit
aae2fca5c9
|
@ -23,7 +23,7 @@ use buddy_system_allocator::LockedHeap;
|
|||
use core::{mem::MaybeUninit, ptr::NonNull};
|
||||
use crate::task::{
|
||||
TaskResult, TaskRepr, TaskState, SharedScheduler, SHARED_SCHEDULER,
|
||||
shared_add_task, shared_peek_task, shared_peek_wake_task, shared_delete_task, shared_set_task_state,
|
||||
shared_add_task, shared_peek_task, shared_delete_task, shared_set_task_state,
|
||||
};
|
||||
use crate::mm::AddressSpaceId;
|
||||
|
||||
|
@ -61,7 +61,6 @@ pub static SHARED_RAW_TABLE: (
|
|||
&'static SharedScheduler, // 共享调度器的地址
|
||||
unsafe extern "C" fn(NonNull<()>, usize, AddressSpaceId, TaskRepr) -> bool, // 添加任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出非睡眠任务
|
||||
unsafe extern "C" fn(NonNull<()>, TaskRepr) -> bool, // 删除任务
|
||||
unsafe extern "C" fn(NonNull<()>, TaskRepr, TaskState), // 改变任务的状态
|
||||
) = (
|
||||
|
@ -70,7 +69,6 @@ pub static SHARED_RAW_TABLE: (
|
|||
&SHARED_SCHEDULER,
|
||||
shared_add_task,
|
||||
shared_peek_task,
|
||||
shared_peek_wake_task,
|
||||
shared_delete_task,
|
||||
shared_set_task_state,
|
||||
);
|
||||
|
|
|
@ -86,39 +86,12 @@ pub unsafe extern "C" fn shared_add_task(
|
|||
}
|
||||
}
|
||||
|
||||
/// 从共享调度器中找到下一个任务
|
||||
///
|
||||
/// 在内核态和用户态都可以调用
|
||||
pub unsafe extern "C" fn shared_peek_task(
|
||||
shared_scheduler: NonNull<()>,
|
||||
should_switch: extern "C" fn(AddressSpaceId) -> bool
|
||||
) -> TaskResult {
|
||||
// 得到共享调度器的引用
|
||||
// println!("[Shared peek task] {:p} {:x}", shared_scheduler, should_switch as usize);
|
||||
let mut s: NonNull<SharedScheduler> = shared_scheduler.cast();
|
||||
let scheduler = s.as_mut().lock();
|
||||
if let Some(task) = scheduler.peek_next_task() {
|
||||
// println!("Pop task {:x?}!", task);
|
||||
if should_switch(task.address_space_id) {
|
||||
// 如果需要跳转到其他地址空间,则不弹出任务,返回需要跳转到的地址空间编号
|
||||
return TaskResult::ShouldYield(task.address_space_id.into_inner())
|
||||
}
|
||||
// 直接把任务交给调用者
|
||||
let task_repr = task.task_repr;
|
||||
drop(scheduler); // 释放锁
|
||||
return TaskResult::Task(task_repr)
|
||||
// 调用者拿到任务后,执行此任务,然后必须销毁任务,否则任务会被重新拿出来再执行一次
|
||||
} else {
|
||||
// 没有任务了,返回已完成
|
||||
return TaskResult::Finished;
|
||||
}
|
||||
}
|
||||
|
||||
/// 从共享调度器中找到下一个任务
|
||||
/// 如果任务处于睡眠状态则重新放入调度队列尾部
|
||||
///
|
||||
/// 内核态和用户态都可以调用
|
||||
pub unsafe extern "C" fn shared_peek_wake_task(
|
||||
pub unsafe extern "C" fn shared_peek_task(
|
||||
shared_scheduler: NonNull<()>,
|
||||
should_switch: extern "C" fn(AddressSpaceId) -> bool
|
||||
) -> TaskResult {
|
||||
|
|
|
@ -40,38 +40,6 @@ pub fn run_until_idle(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn run_wake_until_idle(
|
||||
peek_wake_task: impl Fn() -> TaskResult,
|
||||
delete_task: impl Fn(usize) -> bool,
|
||||
set_task_state: impl Fn(usize, TaskState),
|
||||
) {
|
||||
loop {
|
||||
let task = peek_wake_task();
|
||||
println!(">>> kernel executor: next task = {:x?}", task);
|
||||
match task {
|
||||
TaskResult::Task(task_repr) => { // 在相同的(内核)地址空间里面
|
||||
set_task_state(task_repr, TaskState::Sleeping);
|
||||
let task: Arc<KernelTaskRepr> = unsafe { Arc::from_raw(task_repr as *mut _) };
|
||||
let waker = waker_ref(&task);
|
||||
let mut context = Context::from_waker(&*waker);
|
||||
let ret = task.task().future.lock().as_mut().poll(&mut context);
|
||||
if let Poll::Pending = ret {
|
||||
mem::forget(task); // 不要释放task的内存,它将继续保存在内存中被使用
|
||||
} else { // 否则,释放task的内存
|
||||
delete_task(task_repr);
|
||||
} // 隐含一个drop(task)
|
||||
},
|
||||
TaskResult::ShouldYield(next_asid) => {
|
||||
todo!("切换到 next_asid (= {}) 对应的地址空间", next_asid)
|
||||
},
|
||||
TaskResult::NoWakeTask => {
|
||||
todo!()
|
||||
},
|
||||
TaskResult::Finished => break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl woke::Woke for KernelTaskRepr {
|
||||
fn wake_by_ref(task: &Arc<Self>) {
|
||||
unsafe { task.do_wake() }
|
||||
|
|
|
@ -48,7 +48,6 @@ pub struct SharedPayload {
|
|||
pub(crate) shared_scheduler: NonNull<()>,
|
||||
shared_add_task: unsafe extern "C" fn(NonNull<()>, usize, AddressSpaceId, usize) -> bool,
|
||||
shared_peek_task: unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult,
|
||||
shared_peek_wake_task: unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult,
|
||||
shared_delete_task: unsafe extern "C" fn(NonNull<()>, usize) -> bool,
|
||||
pub(crate) shared_set_task_state: unsafe extern "C" fn(NonNull<()>, usize, TaskState),
|
||||
}
|
||||
|
@ -56,7 +55,7 @@ pub struct SharedPayload {
|
|||
unsafe impl Send for SharedPayload {}
|
||||
unsafe impl Sync for SharedPayload {}
|
||||
|
||||
type SharedPayloadAsUsize = [usize; 8]; // 编译时基地址,初始化函数,共享调度器地址,添加函数,弹出函数
|
||||
type SharedPayloadAsUsize = [usize; 7]; // 编译时基地址,初始化函数,共享调度器地址,添加函数,弹出函数
|
||||
type InitFunction = unsafe extern "C" fn() -> PageList;
|
||||
type SharedPayloadRaw = (
|
||||
usize, // 编译时基地址,转换后类型占位,不使用
|
||||
|
@ -64,7 +63,6 @@ type SharedPayloadRaw = (
|
|||
NonNull<()>,
|
||||
unsafe extern "C" fn(NonNull<()>, usize, AddressSpaceId, usize) -> bool, // 添加任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出非睡眠任务
|
||||
unsafe extern "C" fn(NonNull<()>, usize) -> bool, // 删除任务
|
||||
unsafe extern "C" fn(NonNull<()>, usize, TaskState), // 改变任务的状态
|
||||
);
|
||||
|
@ -94,9 +92,8 @@ impl SharedPayload {
|
|||
shared_scheduler: raw_table.2,
|
||||
shared_add_task: raw_table.3,
|
||||
shared_peek_task: raw_table.4,
|
||||
shared_peek_wake_task: raw_table.5,
|
||||
shared_delete_task: raw_table.6,
|
||||
shared_set_task_state: raw_table.7,
|
||||
shared_delete_task: raw_table.5,
|
||||
shared_set_task_state: raw_table.6,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -115,13 +112,6 @@ impl SharedPayload {
|
|||
f(self.shared_scheduler, should_yield)
|
||||
}
|
||||
|
||||
/// 从共享调度器中得到下一个非睡眠任务
|
||||
pub unsafe fn peek_wake_task(&self, should_yield: extern "C" fn(AddressSpaceId) -> bool) -> TaskResult {
|
||||
let f = self.shared_peek_wake_task;
|
||||
// println!("Peek wake = {:x}, p1 = {:p}, p2 = {:x}", f as usize, self.shared_scheduler, should_yield as usize);
|
||||
f(self.shared_scheduler, should_yield)
|
||||
}
|
||||
|
||||
/// 从共享调度器中删除任务
|
||||
pub unsafe fn delete_task(&self, task_repr: usize) -> bool {
|
||||
let f = self.shared_delete_task;
|
||||
|
|
|
@ -56,39 +56,6 @@ pub fn run_until_ready(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn run_wake_until_ready(
|
||||
peek_wake_task: impl Fn() -> TaskResult,
|
||||
delete_task: impl Fn(usize) -> bool,
|
||||
set_task_state: impl Fn(usize, TaskState),
|
||||
) {
|
||||
loop {
|
||||
let task = peek_wake_task();
|
||||
println!(">>> user executor: next task = {:x?}", task);
|
||||
match task {
|
||||
TaskResult::Task(task_repr) => { // 在相同的地址空间里面
|
||||
set_task_state(task_repr, TaskState::Sleeping);
|
||||
let task: Arc<UserTask> = unsafe { Arc::from_raw(task_repr as *mut _) };
|
||||
let waker = waker_ref(&task);
|
||||
let mut context = Context::from_waker(&*waker);
|
||||
let ret = task.future.lock().as_mut().poll(&mut context);
|
||||
if let Poll::Pending = ret {
|
||||
mem::forget(task); // 不要释放task的内存,它将继续保存在内存中被使用
|
||||
} else {
|
||||
delete_task(task_repr);
|
||||
}
|
||||
},
|
||||
TaskResult::ShouldYield(next_asid) => {
|
||||
// 让出操作
|
||||
do_yield(next_asid);
|
||||
},
|
||||
TaskResult::NoWakeTask => todo!(),
|
||||
TaskResult::Finished => {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 任务当前的状态
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
#[repr(u8)]
|
||||
|
@ -103,19 +70,17 @@ pub struct SharedPayload {
|
|||
shared_scheduler: NonNull<()>,
|
||||
shared_add_task: unsafe extern "C" fn(NonNull<()>, usize, AddressSpaceId, usize) -> bool,
|
||||
shared_peek_task: unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult,
|
||||
shared_peek_wake_task: unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult,
|
||||
shared_delete_task: unsafe extern "C" fn(NonNull<()>, usize) -> bool,
|
||||
shared_set_task_state: unsafe extern "C" fn(NonNull<()>, usize, TaskState),
|
||||
}
|
||||
|
||||
type SharedPayloadAsUsize = [usize; 8]; // 编译时基地址,(已清空)初始化函数,共享调度器地址,添加函数,弹出函数
|
||||
type SharedPayloadAsUsize = [usize; 7]; // 编译时基地址,(已清空)初始化函数,共享调度器地址,添加函数,弹出函数
|
||||
type SharedPayloadRaw = (
|
||||
usize, // 编译时基地址,转换后类型占位,不使用
|
||||
usize, // 初始化函数已清空,不适用
|
||||
NonNull<()>,
|
||||
unsafe extern "C" fn(NonNull<()>, usize, AddressSpaceId, usize) -> bool, // 添加任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出任务
|
||||
unsafe extern "C" fn(NonNull<()>, extern "C" fn(AddressSpaceId) -> bool) -> TaskResult, // 弹出非睡眠任务
|
||||
unsafe extern "C" fn(NonNull<()>, usize) -> bool, // 删除任务
|
||||
unsafe extern "C" fn(NonNull<()>, usize, TaskState), // 改变任务的状态
|
||||
);
|
||||
|
@ -135,9 +100,8 @@ impl SharedPayload {
|
|||
shared_scheduler: raw_table.2,
|
||||
shared_add_task: raw_table.3,
|
||||
shared_peek_task: raw_table.4,
|
||||
shared_peek_wake_task: raw_table.5,
|
||||
shared_delete_task: raw_table.6,
|
||||
shared_set_task_state: raw_table.7,
|
||||
shared_delete_task: raw_table.5,
|
||||
shared_set_task_state: raw_table.6,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,11 +115,6 @@ impl SharedPayload {
|
|||
f(self.shared_scheduler, should_yield)
|
||||
}
|
||||
|
||||
pub unsafe fn peek_wake_task(&self, should_yield: extern "C" fn(AddressSpaceId) -> bool) -> TaskResult {
|
||||
let f = self.shared_peek_wake_task;
|
||||
f(self.shared_scheduler, should_yield)
|
||||
}
|
||||
|
||||
pub unsafe fn delete_task(&self, task_repr: usize) -> bool {
|
||||
let f = self.shared_delete_task;
|
||||
f(self.shared_scheduler, task_repr)
|
||||
|
|
Loading…
Reference in New Issue