|
@@ -4,6 +4,7 @@ use alloc::{boxed::Box, sync::Arc};
|
|
|
use system_error::SystemError;
|
|
|
|
|
|
use crate::{
|
|
|
+ arch::ipc::signal::Signal,
|
|
|
arch::{CurrentIrqArch, CurrentTimeArch},
|
|
|
exception::InterruptArch,
|
|
|
process::ProcessManager,
|
|
@@ -56,9 +57,25 @@ pub fn nanosleep(sleep_time: PosixTimeSpec) -> Result<PosixTimeSpec, SystemError
|
|
|
schedule(SchedMode::SM_NONE);
|
|
|
|
|
|
let end_time = getnstimeofday();
|
|
|
+
|
|
|
+ // 检查是否被信号中断,如果是则取消定时器
|
|
|
+ let current_pcb = ProcessManager::current_pcb();
|
|
|
+ let was_interrupted = current_pcb.has_pending_signal_fast()
|
|
|
+ || Signal::signal_pending_state(true, false, ¤t_pcb);
|
|
|
+
|
|
|
+ // 如果定时器没有超时(被信号中断或其他原因唤醒),则取消定时器
|
|
|
+ if !timer.timeout() {
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+
|
|
|
// 返回正确的剩余时间
|
|
|
let real_sleep_time = end_time - start_time;
|
|
|
let rm_time: PosixTimeSpec = (sleep_time - real_sleep_time.into()).into();
|
|
|
|
|
|
+ // 如果被信号中断,返回 ERESTARTSYS 错误
|
|
|
+ if was_interrupted {
|
|
|
+ return Err(SystemError::ERESTARTSYS);
|
|
|
+ }
|
|
|
+
|
|
|
return Ok(rm_time);
|
|
|
}
|