docs+tools: the call-rate probe's baseline already refutes the timeout reading

v2 counts every KeWaitForSingleObject call per thread per second, tracks how many
distinct objects it saw, and logs the last result. Its HEALTHY baseline is a
result on its own: over a full 22-minute run the main thread cleared 500 calls/s
in 224 separate windows, peaking at 1235 calls/s over up to THIRTEEN distinct
objects, and the last result was X_STATUS_SUCCESS in all 314 windows. Not one
timeout.

So the game normally does hundreds of successful waits a second across many
objects - exactly the blind spot v1 could not see, and the reason a timeout-streak
counter reported the same single poller whether the game was frozen or healthy.

Stated as a consequence rather than a triumph: 500/s is NOT self-selecting, since
the main thread clears it constantly, so the freeze signal has to be a different
shape - a thread far above 1235/s, a new thread, or a window whose result is not
SUCCESS. That still needs a frozen sample; run 5 ended in GAME OVER at ~22 min
without freezing.

freeze_watch.sh now summarises the rate probe per thread when it captures.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Sylpheed RE agent
2026-08-24 08:14:11 +00:00
parent 2d1dca007c
commit 96b73a6295
2 changed files with 43 additions and 1 deletions

View File

@@ -35,8 +35,17 @@ while [ $SECONDS -lt $DEADLINE ]; do
grep -oE 'thread [0-9A-F]+ has timed out [0-9]+ times in a row on object [0-9A-F]+ \(type [0-9]+\)' "$LOG" \
| sed -E 's/has timed out [0-9]+ times in a row //' | sort | uniq -c | sort -rn
echo
echo "=== last 12 probe lines ==="
echo "=== last 12 stuck-wait lines ==="
grep 'wait-probe' "$LOG" | tail -12
echo
echo "=== call-rate probe: per-thread rates in the last 20 windows ==="
grep 'wait-rate' "$LOG" | tail -20 \
| sed -E 's/.*thread ([0-9A-F]+) called KeWaitForSingleObject ([0-9]+) times in ([0-9]+) ms over ([0-9]+) distinct.*last result ([0-9A-F]+)/thread \1 \2 calls\/\3ms \4 objects result \5/'
echo
echo "=== call-rate: highest single window per thread, whole run ==="
grep 'wait-rate' "$LOG" \
| sed -E 's/.*thread ([0-9A-F]+) called KeWaitForSingleObject ([0-9]+) times.*/\1 \2/' \
| sort -k1,1 -k2,2nr | awk '!seen[$1]++ {print " thread " $1 " peak " $2 " calls/window"}'
} | tee -a "$OUT"
exit 0
fi