Files
TORCH/scripts/wait-owned-browser-group.py
T

58 lines
1.9 KiB
Python

"""Explicit Linux qualification only; observe, never signal, one owned group."""
import json
import os
import select
import sys
import time
root = int(sys.argv[1])
expected_start = sys.argv[2]
def record(pid):
with open(f"/proc/{pid}/stat", encoding="utf8") as stream:
value = stream.read()
fields = value[value.rfind(")") + 2:].split()
return fields
assert record(root)[19] == expected_start, "Browser PID identity changed"
assert os.getpgid(root) == root, "Browser must own an isolated process group"
handles = []
executor = int(sys.argv[3])
assert record(executor)[19] == sys.argv[4], "Harness PID identity changed"
handles.append(os.pidfd_open(executor))
observed = 0
for entry in os.scandir("/proc"):
if not entry.name.isdigit():
continue
try:
fields = record(entry.name)
if int(fields[2]) != root or fields[0] in ("Z", "X"):
continue
observed += 1
handles.append(os.pidfd_open(int(entry.name)))
except ProcessLookupError:
pass
except FileNotFoundError:
pass
assert observed > 1, "Qualification must include real browser descendants"
print(json.dumps({"event": "watching", "observed": observed}), flush=True)
deadline = time.monotonic() + 30
remaining = set(handles)
while remaining:
ready, _, _ = select.select(list(remaining), [], [], max(0, deadline - time.monotonic()))
assert ready, "Owned browser group did not reach terminal state"
remaining.difference_update(ready)
for handle in handles:
os.close(handle)
for entry in os.scandir("/proc"):
if not entry.name.isdigit():
continue
try:
fields = record(entry.name)
assert int(fields[2]) != root or fields[0] in ("Z", "X"), "Live group member survived shutdown"
except FileNotFoundError:
pass
print(json.dumps({"event": "terminal", "observed": observed}), flush=True)