diff --git a/kernel/src/filesystem/vfs/file.rs b/kernel/src/filesystem/vfs/file.rs index d407697da..8c316c20c 100644 --- a/kernel/src/filesystem/vfs/file.rs +++ b/kernel/src/filesystem/vfs/file.rs @@ -523,11 +523,4 @@ impl FileDescriptorVec { return Ok(()); } - - /// 释放文件描述符数组 - pub fn drop_fds(&mut self) { - for i in 0..self.fds.len() { - self.fds[i] = None; - } - } } diff --git a/kernel/src/libs/wait_queue.rs b/kernel/src/libs/wait_queue.rs index 19c666682..6df92dc5f 100644 --- a/kernel/src/libs/wait_queue.rs +++ b/kernel/src/libs/wait_queue.rs @@ -4,6 +4,7 @@ use alloc::{collections::LinkedList, sync::Arc, vec::Vec}; use crate::{ arch::{sched::sched, CurrentIrqArch}, exception::InterruptArch, + kerror, process::{ProcessControlBlock, ProcessManager, ProcessState}, }; @@ -28,7 +29,9 @@ impl WaitQueue { /// @brief 让当前进程在等待队列上进行等待,并且,允许被信号打断 pub fn sleep(&self) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(true); + ProcessManager::sleep(true).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(guard); sched(); @@ -40,7 +43,9 @@ impl WaitQueue { F: FnOnce(), { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(true); + ProcessManager::sleep(true).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); f(); drop(guard); @@ -65,14 +70,18 @@ impl WaitQueue { // 安全检查:确保当前处于中断禁止状态 assert!(CurrentIrqArch::is_irq_enabled() == false); let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(true); + ProcessManager::sleep(true).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(guard); } /// @brief 让当前进程在等待队列上进行等待,并且,不允许被信号打断 pub fn sleep_uninterruptible(&self) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(false); + ProcessManager::sleep(false).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(guard); sched(); @@ -82,7 +91,9 @@ impl WaitQueue { /// 在当前进程的pcb加入队列后,解锁指定的自旋锁。 pub fn sleep_unlock_spinlock(&self, to_unlock: SpinLockGuard) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(true); + ProcessManager::sleep(true).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(to_unlock); drop(guard); @@ -93,7 +104,9 @@ impl WaitQueue { /// 在当前进程的pcb加入队列后,解锁指定的Mutex。 pub fn sleep_unlock_mutex(&self, to_unlock: MutexGuard) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(true); + ProcessManager::sleep(true).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(to_unlock); drop(guard); @@ -104,7 +117,9 @@ impl WaitQueue { /// 在当前进程的pcb加入队列后,解锁指定的自旋锁。 pub fn sleep_uninterruptible_unlock_spinlock(&self, to_unlock: SpinLockGuard) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(false); + ProcessManager::sleep(false).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(to_unlock); drop(guard); @@ -115,7 +130,9 @@ impl WaitQueue { /// 在当前进程的pcb加入队列后,解锁指定的Mutex。 pub fn sleep_uninterruptible_unlock_mutex(&self, to_unlock: MutexGuard) { let mut guard: SpinLockGuard = self.0.lock(); - ProcessManager::sleep(false); + ProcessManager::sleep(false).unwrap_or_else(|e| { + panic!("sleep error: {:?}", e); + }); guard.wait_list.push_back(ProcessManager::current_pcb()); drop(to_unlock); drop(guard); @@ -142,8 +159,8 @@ impl WaitQueue { } } let to_wakeup = guard.wait_list.pop_front().unwrap(); - ProcessManager::wakeup(&to_wakeup); - return true; + let res = ProcessManager::wakeup(&to_wakeup).is_ok(); + return res; } /// @brief 唤醒在队列中,符合条件的所有进程。 @@ -160,8 +177,10 @@ impl WaitQueue { // 如果队列头部的pcb的state与给定的state相与,结果不为0,则唤醒 while let Some(to_wakeup) = guard.wait_list.pop_front() { if let Some(state) = state { - if to_wakeup.sched_info().state() != state { - ProcessManager::wakeup(&to_wakeup); + if to_wakeup.sched_info().state() == state { + ProcessManager::wakeup(&to_wakeup).unwrap_or_else(|e| { + kerror!("wakeup pid: {:?} error: {:?}", to_wakeup.basic().pid(), e); + }); continue; } } diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index 8ddd87e8d..190b92032 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -154,19 +154,28 @@ impl ProcessManager { /// 唤醒一个进程 pub fn wakeup(pcb: &Arc) -> Result<(), SystemError> { - if pcb.sched_info().state() != ProcessState::Runnable { + let state = pcb.sched_info().state(); + if state.is_blocked() { let mut writer = pcb.sched_info_mut(); - if writer.state() != ProcessState::Runnable { + let state = writer.state(); + if state.is_blocked() { writer.set_state(ProcessState::Runnable); sched_enqueue(pcb.clone(), true); return Ok(()); + } else if state.is_exited() { + return Err(SystemError::EINVAL); + } else { + return Ok(()); } + } else if state.is_exited() { + return Err(SystemError::EINVAL); + } else { + return Ok(()); } - return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); } /// 标志当前进程永久睡眠,移出调度队列 - pub unsafe fn sleep(interruptable: bool) -> Result<(), SystemError> { + pub fn sleep(interruptable: bool) -> Result<(), SystemError> { let pcb = ProcessManager::current_pcb(); let mut writer = pcb.sched_info_mut(); if writer.state() != ProcessState::Exited(0) { @@ -291,6 +300,23 @@ pub enum ProcessState { Exited(usize), } +impl ProcessState { + #[inline(always)] + pub fn is_runnable(&self) -> bool { + return matches!(self, ProcessState::Runnable); + } + + #[inline(always)] + pub fn is_blocked(&self) -> bool { + return matches!(self, ProcessState::Blocked(_)); + } + + #[inline(always)] + pub fn is_exited(&self) -> bool { + return matches!(self, ProcessState::Exited(_)); + } +} + bitflags! { /// pcb的标志位 pub struct ProcessFlags: usize {