From aae2fca5c97ed34ccfb3ecf88fc7a4b993607a03 Mon Sep 17 00:00:00 2001 From: SKTT1Ryze Date: Sat, 22 May 2021 11:21:53 +0800 Subject: [PATCH] small fix --- shared-scheduler/src/main.rs | 4 +-- shared-scheduler/src/task.rs | 29 +----------------- tornado-kernel/src/task/executor.rs | 32 -------------------- tornado-kernel/src/task/shared.rs | 16 ++-------- tornado-user/src/shared.rs | 47 ++--------------------------- 5 files changed, 8 insertions(+), 120 deletions(-) diff --git a/shared-scheduler/src/main.rs b/shared-scheduler/src/main.rs index 833df49..5b5cebb 100644 --- a/shared-scheduler/src/main.rs +++ b/shared-scheduler/src/main.rs @@ -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, ); diff --git a/shared-scheduler/src/task.rs b/shared-scheduler/src/task.rs index 6b4e4fa..9b11b3e 100644 --- a/shared-scheduler/src/task.rs +++ b/shared-scheduler/src/task.rs @@ -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 = 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 { diff --git a/tornado-kernel/src/task/executor.rs b/tornado-kernel/src/task/executor.rs index feda9fb..839d1c1 100644 --- a/tornado-kernel/src/task/executor.rs +++ b/tornado-kernel/src/task/executor.rs @@ -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 = 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) { unsafe { task.do_wake() } diff --git a/tornado-kernel/src/task/shared.rs b/tornado-kernel/src/task/shared.rs index 87ed1e8..a75d29d 100644 --- a/tornado-kernel/src/task/shared.rs +++ b/tornado-kernel/src/task/shared.rs @@ -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; diff --git a/tornado-user/src/shared.rs b/tornado-user/src/shared.rs index 47c51a0..ca1066f 100644 --- a/tornado-user/src/shared.rs +++ b/tornado-user/src/shared.rs @@ -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 = 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)