// SpeedBreaker runtime. GPL-3.0-or-later (see COPYING). See report.h. // // Hang reports. A thread checks twice a second whether the game still makes // frames. It calls a hang when either // - the command processor has sat in one WAIT_REG_MEM for 10 s (the // world-entry hang of 2026-09-28: a malformed ring left it waiting for a // value nothing would write), or // - no new frame came for 20 s while the game read almost nothing from // disk (a deadlock elsewhere: the CP idles, nothing is submitted). // Loading screens and movies present frames all along (their gaps were // measured). Time with the window hidden or the game suspended (iOS: // the app isn't the active one) doesn't count, nor, for the no-frame check, // time with the settings menu open. A report is written once per episode; // the episode ends when frames come again. // // Each runtime thread's host stack is taken where it stands: the watchdog // signals it (SIGURG, otherwise unused here) and its handler records // backtrace() into the thread's slot. The recompiled game's calls are host // calls, so the stack of a guest thread is its guest call chain. #include #include "report.h" #include "internal.h" #include #include #include #include #include #include