Files
MobileGL/docs/Disaggregated/notes/p13/fcl-soak/README.md
T

4.3 KiB

FCL silent-death soak (P13, 2026-10-07)

User request: soak FCL launches on the Y700 (Magma, Espryt control) to root-cause the "silent Magma death after MobileGL init" seen once in the P13 FCL smoke. User decision afterwards: the cause is FCL's, leave FCL as-is, no MobileGL workaround; recorded as a debt (../../DEBTS.md, "FCL game process can die silently").

Result

Every silent death is ApplicationExitInfo reason=2 (SIGNALED) status=34 - signal 34 is SIGRTMIN+2, the wake-up signal of Android libcore's AsynchronousCloseMonitor. No tombstone, no kgsl/GPU fault line, no debuggerd output, in any death.

Mechanism (ftrace signal_generate / signal_deliver filtered on sig==34, plus a 0.5 s sampler of /proc/<pid>/status SigCgt):

  1. FCL's game process starts with Android's handler set (SigCgt 0x6e400084f8, bit 33 = sig 34 caught).
  2. About 0.5 s after FCL logs Renderer: MobileGLDev... (JVM start for the game), the whole set is replaced by the JVM's (SigCgt 0x1005cef, later 0x2000000001005cef): sig 34 is no longer caught.
  3. FCL's own okhttp stack (Okio Watchdog thread) times out a blocked read and sends sig 34 to the reading onPool-worker-N thread (AsynchronousCloseMonitor::signalBlockedThreads, code=-6 = SI_TKILL).
  4. With the default disposition the kernel takes the fatal fast path: signal_generate with no signal_deliver, and the whole process dies. In the relaunched launcher process the same watchdog's signals are delivered to libcore's handler (sa_handler=79a72f3fa0) and nothing happens.

Renderer-independent: reproduced with the P13 library on both backends and with the pre-P13 (P12 end, 743f4e8e) library; several deaths happen before MobileGL has logged anything beyond FCL's renderer line. Rate depends on whether FCL's background network read times out in that window (network-dependent), not on the GL library. Untested with non-MobileGL renderers.

Fix belongs in FCL: save libcore's SIGRTMIN+2 sigaction before creating the JVM and restore it after (or do not reset that signal). Left for the user.

Soak sizes

soak library runs deaths (all status=34)
clean (soak-p13-clean-summary.txt, soak2.sh with the SigCgt sampler and per-run ftrace) P13 FCL lib at c1e985c8 30 (22 Magma, 8 Espryt) 18: Magma 13/22, Espryt 5/8
P12 control (soak-p12-control-summary.txt) P12 end 743f4e8e 10 Magma 2
matched A/B (soak-ab-p12-p13-summary.txt, soak3.sh): P12 and P13 libraries alternated launch by launch, Magma, same world, settings and network window, 40 s in-world P12 743f4e8e / P13 c1e985c8 10 + 10 P12 4/10, P13 2/10

Does the P13 library raise the rate? No evidence it does. The clean soak's 18/30 against the first P12 control's 2/10 was not a comparable pair: the two ran at different times (the rate tracks whether FCL's background request is still pending, i.e. network conditions), and the P12 control overlapped the contaminated P13 runs below. In the matched, interleaved A/B the P12 library died more often (4/10) than the P13 one (2/10). The timeline is library-independent too: in every death logcat FCL's Renderer: line is followed by the JVM's signal reset after 0.2-0.6 s and by MobileGL's first log line after about 6.2 s for both libraries (P12 deaths: 6.3 s and 6.2 s), and the deaths cluster at the same fixed offsets after the Renderer: line on both libraries (about 1.3 s, 9.4 s and 17.4 s) - timeouts started before MobileGL is loaded, not a window MobileGL's start-up widens.

Earlier P13 runs (first 5-run soak) are not counted: two soak scripts were found driving the phone at once and force-stopping each other's runs; soak2.sh now takes a lock.

Per-death evidence kept here for one representative death (clean run 4, Magma): the ftrace excerpt (run004-magma-ftrace-signal34.txt - pid 27854 is the dying process's worker, generated with no delivery), the SigCgt transitions (run004-magma-sigcgt-transitions.txt) and the logcat lines (run004-magma-logcat-excerpt.txt). The full per-run logcat/dmesg/ftrace/exit-info captures stayed in the session scratchpad and were not committed.

Device restored afterwards: original FCL libMobileGL.so (md5 checked) and config.json, ftrace signal events and tracing_on off, svc power stayon false, anland relaunched.