Explorar o código

Kernel: Send SIGCHLD to the parent process when changing stopped state

This is done also by linux (signal.c:936 in v5.11) at least.
It's a pretty handy notification that allows the parent process to skip
going through a `waitpid` and guesswork to figure out the current state
of a child process.
AnotherTest %!s(int64=4) %!d(string=hai) anos
pai
achega
e3fd914187
Modificáronse 1 ficheiros con 8 adicións e 0 borrados
  1. 8 0
      Kernel/Thread.cpp

+ 8 - 0
Kernel/Thread.cpp

@@ -911,6 +911,10 @@ void Thread::set_state(State new_state, u8 stop_signal)
                 return IterationDecision::Continue;
             });
             process.unblock_waiters(Thread::WaitBlocker::UnblockFlags::Continued);
+            // Tell the parent process (if any) about this change.
+            if (auto parent = Process::from_pid(process.ppid())) {
+                [[maybe_unused]] auto result = parent->send_signal(SIGCHLD, &process);
+            }
         }
     }
 
@@ -930,6 +934,10 @@ void Thread::set_state(State new_state, u8 stop_signal)
                 return IterationDecision::Continue;
             });
             process.unblock_waiters(Thread::WaitBlocker::UnblockFlags::Stopped, stop_signal);
+            // Tell the parent process (if any) about this change.
+            if (auto parent = Process::from_pid(process.ppid())) {
+                [[maybe_unused]] auto result = parent->send_signal(SIGCHLD, &process);
+            }
         }
     } else if (m_state == Dying) {
         VERIFY(previous_state != Blocked);