small fix

This commit is contained in:
SKTT1Ryze 2021-05-22 11:21:53 +08:00
parent 5cfdb5e975
commit aae2fca5c9
5 changed files with 8 additions and 120 deletions

View File

@ -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,
);

View File

@ -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 {

View File

@ -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() }

View File

@ -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;

View File

@ -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)