mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-25 10:03:23 +00:00
bugfix: 修复无法sleep的问题以及进程处于block(true)状态时无法被信号唤醒&唤醒后不处理信号的问题 (#470)
This commit is contained in:
@ -141,12 +141,7 @@ impl Signal {
|
||||
/// @param pt siginfo结构体中,pid字段代表的含义
|
||||
fn complete_signal(&self, pcb: Arc<ProcessControlBlock>, pt: PidType) {
|
||||
// kdebug!("complete_signal");
|
||||
// todo: 将信号产生的消息通知到正在监听这个信号的进程(引入signalfd之后,在这里调用signalfd_notify)
|
||||
// 将这个信号加到目标进程的sig_pending中
|
||||
pcb.sig_info_mut()
|
||||
.sig_pending_mut()
|
||||
.signal_mut()
|
||||
.insert(self.clone().into());
|
||||
|
||||
compiler_fence(core::sync::atomic::Ordering::SeqCst);
|
||||
// ===== 寻找需要wakeup的目标进程 =====
|
||||
// 备注:由于当前没有进程组的概念,每个进程只有1个对应的线程,因此不需要通知进程组内的每个进程。
|
||||
@ -154,11 +149,17 @@ impl Signal {
|
||||
|
||||
// let _signal = pcb.sig_struct();
|
||||
|
||||
let mut _target: Option<Arc<ProcessControlBlock>> = None;
|
||||
let target_pcb: Option<Arc<ProcessControlBlock>>;
|
||||
|
||||
// 判断目标进程是否想接收这个信号
|
||||
if self.wants_signal(pcb.clone()) {
|
||||
_target = Some(pcb.clone());
|
||||
// todo: 将信号产生的消息通知到正在监听这个信号的进程(引入signalfd之后,在这里调用signalfd_notify)
|
||||
// 将这个信号加到目标进程的sig_pending中
|
||||
pcb.sig_info_mut()
|
||||
.sig_pending_mut()
|
||||
.signal_mut()
|
||||
.insert(self.clone().into());
|
||||
target_pcb = Some(pcb.clone());
|
||||
} else if pt == PidType::PID {
|
||||
/*
|
||||
* There is just one thread and it does not need to be woken.
|
||||
@ -176,9 +177,9 @@ impl Signal {
|
||||
// TODO:引入进程组后,在这里挑选一个进程来唤醒,让它执行相应的操作。
|
||||
compiler_fence(core::sync::atomic::Ordering::SeqCst);
|
||||
// TODO: 到这里,信号已经被放置在共享的pending队列中,我们在这里把目标进程唤醒。
|
||||
if _target.is_some() {
|
||||
let guard = pcb.sig_struct();
|
||||
signal_wake_up(pcb.clone(), guard, *self == Signal::SIGKILL);
|
||||
if let Some(target_pcb) = target_pcb {
|
||||
let guard = target_pcb.sig_struct();
|
||||
signal_wake_up(target_pcb.clone(), guard, *self == Signal::SIGKILL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,7 +202,9 @@ impl Signal {
|
||||
return true;
|
||||
}
|
||||
|
||||
if pcb.sched_info().state().is_blocked() {
|
||||
if pcb.sched_info().state().is_blocked()
|
||||
&& (pcb.sched_info().state().is_blocked_interruptable() == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -209,7 +212,6 @@ impl Signal {
|
||||
|
||||
// 检查目标进程是否有信号正在等待处理,如果是,则返回false,否则返回true
|
||||
if pcb.sig_info().sig_pending().signal().bits() == 0 {
|
||||
assert!(pcb.sig_info().sig_pending().queue().q.is_empty());
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user