aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver-test/process-tests.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-03-24 15:47:23 +0100
committerGitHub Enterprise <[email protected]>2026-03-24 15:47:23 +0100
commit21c2abb1bde697c31bee562465cb986a0429a299 (patch)
tree3734d235e79a8fbed307ae5c248936d356553b61 /src/zenserver-test/process-tests.cpp
parentv5.7.25 hotpatch (#874) (diff)
downloadzen-21c2abb1bde697c31bee562465cb986a0429a299.tar.xz
zen-21c2abb1bde697c31bee562465cb986a0429a299.zip
Subprocess Manager (#889)
Adds a `SubprocessManager` for managing child processes with ASIO-integrated async exit detection, stdout/stderr pipe capture, and periodic metrics sampling. Also introduces `ProcessGroup` for OS-backed process grouping (Windows JobObjects / POSIX process groups). ### SubprocessManager - Async process exit detection using platform-native mechanisms (Windows `object_handle`, Linux `pidfd_open`, macOS `kqueue EVFILT_PROC`) — no polling - Stdout/stderr capture via async pipe readers with per-process or default callbacks - Periodic round-robin metrics sampling (CPU, memory) across managed processes - Spawn, adopt, remove, kill, and enumerate managed processes ### ProcessGroup - OS-level process grouping: Windows JobObject (kill-on-close guarantee), POSIX `setpgid` (bulk signal delivery) - Atomic group kill via `TerminateJobObject` (Windows) or `kill(-pgid, sig)` (POSIX) - Per-group aggregate metrics and enumeration ### ProcessHandle improvements - Added explicit constructors from `int` (pid) and `void*` (native handle) - Added move constructor and move assignment operator ### ProcessMetricsTracker - Cross-platform process metrics (CPU time, working set, page faults) via `QueryProcessMetrics()` - ASIO timer-driven periodic sampling with configurable interval and batch size - Aggregate metrics across tracked processes ### Other changes - Fixed `zentest-appstub` writing a spurious `Versions` file to cwd on every invocation
Diffstat (limited to 'src/zenserver-test/process-tests.cpp')
-rw-r--r--src/zenserver-test/process-tests.cpp25
1 files changed, 5 insertions, 20 deletions
diff --git a/src/zenserver-test/process-tests.cpp b/src/zenserver-test/process-tests.cpp
index 649f24f54..ae11bb294 100644
--- a/src/zenserver-test/process-tests.cpp
+++ b/src/zenserver-test/process-tests.cpp
@@ -67,10 +67,7 @@ TEST_CASE("pipe.capture_stdout")
CreateProcOptions Options;
Options.StdoutPipe = &Pipe;
- CreateProcResult ProcResult = CreateProc(AppStub, CommandLine, Options);
-
- ProcessHandle Process;
- Process.Initialize(ProcResult);
+ ProcessHandle Process(CreateProc(AppStub, CommandLine, Options));
// Close the write end, then drain before Wait() to avoid deadlock if output fills the pipe buffer.
Pipe.CloseWriteEnd();
@@ -95,10 +92,7 @@ TEST_CASE("pipe.capture_multiline")
CreateProcOptions Options;
Options.StdoutPipe = &Pipe;
- CreateProcResult ProcResult = CreateProc(AppStub, CommandLine, Options);
-
- ProcessHandle Process;
- Process.Initialize(ProcResult);
+ ProcessHandle Process(CreateProc(AppStub, CommandLine, Options));
Pipe.CloseWriteEnd();
@@ -211,10 +205,7 @@ TEST_CASE("pipe.capture_with_nonzero_exit")
CreateProcOptions Options;
Options.StdoutPipe = &Pipe;
- CreateProcResult ProcResult = CreateProc(AppStub, CommandLine, Options);
-
- ProcessHandle Process;
- Process.Initialize(ProcResult);
+ ProcessHandle Process(CreateProc(AppStub, CommandLine, Options));
Pipe.CloseWriteEnd();
@@ -237,10 +228,7 @@ TEST_CASE("pipe.stderr_on_shared_pipe")
CreateProcOptions Options;
Options.StdoutPipe = &Pipe;
- CreateProcResult ProcResult = CreateProc(AppStub, CommandLine, Options);
-
- ProcessHandle Process;
- Process.Initialize(ProcResult);
+ ProcessHandle Process(CreateProc(AppStub, CommandLine, Options));
Pipe.CloseWriteEnd();
@@ -268,10 +256,7 @@ TEST_CASE("pipe.separate_stderr")
Options.StdoutPipe = &StdoutPipe;
Options.StderrPipe = &StderrPipe;
- CreateProcResult ProcResult = CreateProc(AppStub, CommandLine, Options);
-
- ProcessHandle Process;
- Process.Initialize(ProcResult);
+ ProcessHandle Process(CreateProc(AppStub, CommandLine, Options));
StdoutPipe.CloseWriteEnd();
StderrPipe.CloseWriteEnd();