From 942bb6d7dd2cdab86c335ff1adb55887f4ccf3a0 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 6 Oct 2026 14:34:27 -0400 Subject: [PATCH] [Fix] (P13 W5 S7): the verb stamp and read verdicts build only with the poison that asks them. --- MobileGL/MG_Backend/MGPipe/PipeInputs.cpp | 6 ++++-- docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp b/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp index 1f22901a..b4a79756 100644 --- a/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp +++ b/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp @@ -47,7 +47,9 @@ namespace MobileGL::MG_Pipe { return std::nullopt; } -#if MOBILEGL_BUILD_RECORD_ARM +// The stamp is the poison's (m_filled, the generations): a build without MOBILEGL_PIPE_POISON +// compiles no read check that could ask any of this. Every transport build has the poison. +#if MOBILEGL_BUILD_RECORD_ARM && MOBILEGL_PIPE_POISON // ================================================================================ // P5: the server's verb stamp, the residual-pull counter, and the four-way read verdict // ================================================================================ @@ -603,7 +605,7 @@ namespace MobileGL::MG_Pipe { if (ownership == MGPipeFieldOwnership::kBarrierPulled) CountBarrierPull(field, gPipeInputs.CurrentVerb()); } -#endif // MOBILEGL_BUILD_RECORD_ARM +#endif // MOBILEGL_BUILD_RECORD_ARM && MOBILEGL_PIPE_POISON #if MOBILEGL_PIPE_VERIFY namespace { diff --git a/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md b/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md index b3eff5da..7efa821e 100644 --- a/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md +++ b/docs/Disaggregated/notes/p13/HANDOFF-2026-10-06.md @@ -46,6 +46,15 @@ - **本机 retrace**:`~/mgl-p13-tools/sync.sh` 才物化 LFS fixture(`sb.sh` 用的 `sync2.sh` 会把它们复原为指针);跑前设 `MOBILEGL_GPU_HANG_BUDGET_MS=0`。 - 完整的 site 分类表与后续步骤(W4b 纹理别名 store、W4c、Magma)见 Plan 代理的设计(会话 scratchpad `W4-design.md`;要点已并入本节)。 +## 3c. W5 要点(记录臂移出 MG_Remote,S7 已翻转) + +- **形态**:`MOBILEGL_BUILD_RECORD_ARM` 是普通 CMake 变量,S7 起恒 ON(S8 unifdef 掉)。push 库(无 MG_Remote,FCL 形态)现在跑记录臂:`runtime_mode_proof` 要两形态都有 `MG_Record` 符号(push 294 / split 300),push 仍 0 个 `MG_Remote`。 +- **代码位置**(命名空间 `MG_Record`):暂存库 `MG_Backend/Record/`;`RecordVerbSink`(记录动词的服务端半边,`ServerVerbSink` 继承它);动词发射器 + monolith 动词端口 + GPU 写集合 `MG_Impl/Pipe/Verb/`;持久映射跟踪器 `MG_State/GLState/BufferState/`。跨层只经缝:`MG_Pipe/PipeSessionFail.h`(`MGPipeRecordFail/Latch/Latched`,`FatalFunnel.cpp` 静态注册)、`PipeClientSeam.h`(设备丢失 / 拒绝后确认丢失)、`MG_Backend/Record/ApplyRoleBackend.h`、`VerbPort.h` 的 `VerbSession` 解析器(`EmitTables.cpp` 静态安装)。include-closure 的 `record-core` 探针守住它们不碰 `MG_Remote/` 与 flatbuffers。 +- **翻转后的教训**:试翻转「能链接」不等于「行为相同」——split 里的 monolith 记录臂跑过的很多块仍挂在 DISAGG 上,push 编进了谓词却漏了消费者,结果是 Magma 析构崩(wire store 没在 VMA 之前清)、Espryt 读回 ERROR(记录动词的 verb 状态盖章没编进来)。办法:`scratchpad/suspects.py` 扫「DISAGG 块里出现记录臂机制」的块,逐个判;然后用 push 的 unit + integration-gpu + verify 树三套跑到绿。还剩的 DISAGG 块(约 300)都是传输本身:会话、共享图像、T0、设备丢失闩、角色拆分、caps 来源、EGL 服务端窗口。 +- **verify 树第一次跑 monolith 记录臂**:监视读钩子在端口的中性 pack 窗口里改用已应用的 pack(`MonolithPortApplyingForVerify()`);monolith 的 poison-omission 对照改省略 `ReadPixels:GetPixelStoreParameters`(记录臂不再读 `GetActiveTextureUnit@GenerateMipmap`)。 +- **FCL 开关**:`MOBILEGL_PIPE_PERSISTENT_MPROTECT=0` 不装跟踪器的 SIGSEGV 处理器(JVM 隐式空指针检查也用 SIGSEGV,处理器按设计链式转交,但从未在 HotSpot 里跑过)。设备上 FCL 冒烟仍是延后检查项。 +- **剩余**:S8(unifdef 掉 `RECORD_ARM`、`!RECORD_ARM` 臂、`retired_switches` 规则、`wire_declines_audit` 回到单守卫);测试文件里仍有 DISAGG 守卫的记录臂用例(`SplitBufferTest` 等)随 S8 / W6 处理。 + ## 4. 下一步 1. W2/W3a 的 CI:看完归类;然后推 W3b/W3c(普查基线已同提交退役名字)。