Skip to content

Commit 1a0b526

Browse files
authored
Merge branch 'DragonOS-Community:master' into patch-1
2 parents 25c7ffe + 65f6119 commit 1a0b526

File tree

5 files changed

+25
-21
lines changed

5 files changed

+25
-21
lines changed

kernel/src/ipc/signal.rs

+18
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,24 @@ pub fn set_current_blocked(new_set: &mut SigSet) {
615615
__set_current_blocked(new_set);
616616
}
617617

618+
/// 参考 https://code.dragonos.org.cn/xref/linux-6.6.21/kernel/signal.c?fi=set_user_sigmask#set_user_sigmask
619+
/// 功能与set_current_blocked相同,多一步保存当前的sig_blocked到saved_sigmask
620+
/// 由于这之中设置了saved_sigmask,因此从系统调用返回之前需要恢复saved_sigmask
621+
pub fn set_user_sigmask(new_set: &mut SigSet) {
622+
let pcb = ProcessManager::current_pcb();
623+
let mut guard = pcb.sig_info_mut();
624+
let oset = *guard.sig_blocked();
625+
626+
let flags = pcb.flags();
627+
flags.set(ProcessFlags::RESTORE_SIG_MASK, true);
628+
629+
let saved_sigmask = guard.saved_sigmask_mut();
630+
*saved_sigmask = oset;
631+
drop(guard);
632+
633+
set_current_blocked(new_set);
634+
}
635+
618636
/// 设置当前进程的屏蔽信号 (sig_block)
619637
///
620638
/// ## 参数

kernel/src/net/event_poll/syscall.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use system_error::SystemError;
33
use crate::{
44
arch::ipc::signal::SigSet,
55
filesystem::vfs::file::FileMode,
6-
ipc::signal::set_current_blocked,
6+
ipc::signal::{restore_saved_sigmask, set_user_sigmask},
77
mm::VirtAddr,
88
syscall::{
99
user_access::{UserBufferReader, UserBufferWriter},
@@ -96,13 +96,12 @@ impl Syscall {
9696
sigmask: &mut SigSet,
9797
) -> Result<usize, SystemError> {
9898
// 设置屏蔽的信号
99-
set_current_blocked(sigmask);
99+
set_user_sigmask(sigmask);
100100

101101
let wait_ret = Self::epoll_wait(epfd, epoll_event, max_events, timespec);
102102

103103
if wait_ret.is_err() && *wait_ret.as_ref().unwrap_err() != SystemError::EINTR {
104-
// TODO: 恢复信号?
105-
// link:https://code.dragonos.org.cn/xref/linux-6.1.9/fs/eventpoll.c#2294
104+
restore_saved_sigmask();
106105
}
107106
wait_ret
108107
}

kernel/src/process/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,7 @@ pub fn process_init() {
15961596
pub struct ProcessSignalInfo {
15971597
// 当前进程被屏蔽的信号
15981598
sig_blocked: SigSet,
1599+
// 暂存旧信号,用于恢复
15991600
saved_sigmask: SigSet,
16001601
// sig_pending 中存储当前线程要处理的信号
16011602
sig_pending: SigPending,

package-lock.json

-17
This file was deleted.

tools/.gdbinit

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
target remote localhost:1234
2+
file bin/kernel/kernel.elf
3+
set follow-fork-mode child

0 commit comments

Comments
 (0)