diff --git a/kernel/src/fs/procfs/pid/task/stat.rs b/kernel/src/fs/procfs/pid/task/stat.rs
index 269457638..56ed1be73 100644
--- a/kernel/src/fs/procfs/pid/task/stat.rs
+++ b/kernel/src/fs/procfs/pid/task/stat.rs
@@ -111,6 +111,8 @@ impl FileOps for StatFileOps {
SleepingState::Running => 'R',
SleepingState::Interruptible => 'S',
SleepingState::Uninterruptible => 'D',
+ SleepingState::StopBySignal => 'T',
+ SleepingState::StopByPtrace => 't',
}
};
let ppid = process.parent().pid();
diff --git a/kernel/src/fs/procfs/pid/task/status.rs b/kernel/src/fs/procfs/pid/task/status.rs
index 7e502cdab..6b9e30e00 100644
--- a/kernel/src/fs/procfs/pid/task/status.rs
+++ b/kernel/src/fs/procfs/pid/task/status.rs
@@ -100,6 +100,8 @@ impl FileOps for StatusFileOps {
SleepingState::Running => "R (running)",
SleepingState::Interruptible => "S (sleeping)",
SleepingState::Uninterruptible => "D (disk sleep)",
+ SleepingState::StopBySignal => "T (stopped)",
+ SleepingState::StopByPtrace => "t (tracing stop)",
}
};
writeln!(status_output, "State:\t{}", state).unwrap();
diff --git a/kernel/src/process/execve.rs b/kernel/src/process/execve.rs
index 3a0a26a4a..828a19bb1 100644
--- a/kernel/src/process/execve.rs
+++ b/kernel/src/process/execve.rs
@@ -17,7 +17,7 @@ use crate::{
signal::{
constants::{SIGCHLD, SIGKILL},
signals::kernel::KernelSignal,
- HandlePendingSignal, SigStack,
+ HandlePendingSignal, PauseReason, SigStack,
},
ContextUnshareAdminApi, Credentials, Process, ProgramToLoad,
},
@@ -191,7 +191,8 @@ fn wait_other_threads_exit(ctx: &Context) -> Result<()> {
// Wait until any signal comes or any other thread exits.
let (waiter, waker) = Waiter::new_pair();
- ctx.posix_thread.set_signalled_waker(waker.clone());
+ ctx.posix_thread
+ .set_signalled_waker(waker.clone(), PauseReason::Sleep);
if ctx.has_pending_sigkill() {
ctx.posix_thread.clear_signalled_waker();
return_errno_with_message!(Errno::EAGAIN, "the current thread has received SIGKILL");
diff --git a/kernel/src/process/posix_thread/mod.rs b/kernel/src/process/posix_thread/mod.rs
index 3b9a0d584..2ca42df9d 100644
--- a/kernel/src/process/posix_thread/mod.rs
+++ b/kernel/src/process/posix_thread/mod.rs
@@ -16,7 +16,11 @@ use crate::{
events::IoEvents,
fs::{file_table::FileTable, thread_info::ThreadFsInfo},
prelude::*,
- process::{namespace::nsproxy::NsProxy, signal::PollHandle, Pid},
+ process::{
+ namespace::nsproxy::NsProxy,
+ signal::{PauseReason, PollHandle},
+ Pid,
+ },
thread::{Thread, Tid},
time::{clocks::ProfClock, Timer, TimerManager},
};
@@ -64,8 +68,8 @@ pub struct PosixThread {
/// Thread-directed sigqueue
sig_queues: SigQueues,
/// The per-thread signal [`Waker`], which will be used to wake up the thread
- /// when enqueuing a signal.
- signalled_waker: SpinLock