fix(m52): r1 评审 P2-1 class 缺失 WARN 去刷屏 + 两个 nit(snprintf clamp / 恒真断言)
P2-1(必修):`multi_font: class %s font %s missing, fallback global` 与上一轮修掉的 enabled 行同在 meow_font_reload_multifont() 里、被 main_menu.c:1385 每 2s 调一次; 命中「某个 font.class_* 非空但文件缺失/不可读」时最多 6 行/2s(3 行/s),比 enabled 行凶 6 倍,会让「空转 60s 日志不增长」在 class 缺失形态下失效。 改法:循环内只记「本轮缺失类别位图」,循环外经新纯函数 mf_missing_warn_mask() 做跃迁 判定(缺失集合不变 → 静默;新类别缺失 → 1 条;恢复后再缺失 → 再 1 条)。回退行为不变 (缺失类别照旧回退全局),日志文本/参数不变。另加 _Static_assert 钉住类别数 ≤32(位图宽度)。 nit:wd_log() 的 snprintf 返回值显式 clamp(原「buf≤511+前缀≤23<544」是隐式不变量); test_wd_fw 的 "scan finds self" 原断言带 `|| np > 0` 恒真、等于没测 → 改为真查表断言 getpid() 在 wd_rg_pid[] 中且 comm 非空、并与 /proc/self/stat 的 pid/ppid 交叉核对。 验证:test_wd_fw 128 pass/0 fail(原 124,+4 来自强化后的自扫断言); test_mf_logsig 21 pass/0 fail(原 13,+8 为 P2-1 验收:单类缺失 60s@2s 只 1 条、 缺失集合变化再 1 条、恢复后再缺失再 1 条);launcher 宿主测试 ALL PASS; 三处交叉编译 0 warning(watchdog 100,116 B/25f76950、launcherd 902,044 B/75629078、 audiod 68,732 B/ebb9a7ac 未变=bind hunk 未动)。
This commit is contained in:
1 parent
166b32d0e5
commit
0d6c56100f
5 files changed
+93
-4
No files matched your search
@@ -97,6 +97,40 @@ int main(void)
|
||||
printf(" (旧实现 60s 空转 = 30 行;新实现稳态 = 0 行,本用例全程 %d 行)\n", emits);
|
||||
}
|
||||
|
||||
/* ---- 6. 「class 字体缺失」WARN 的跃迁门控(r1 评审 P2-1 的验收断言)----
|
||||
* 场景:某个 font.class_* 配置了但字体文件缺失 → 该类别回退全局(行为不变),
|
||||
* 旧实现每 2s 每类各打一条(最多 6 行/2s = 3 行/s)。要求:
|
||||
* 缺失集合不变 → 60s(30 次) 只出现 1 次;
|
||||
* 缺失的类别变了(另一个 class 也缺失)→ 再出现 1 次(不是一次性闩锁);
|
||||
* 某类恢复后再缺失 → 也算新跃迁,再 1 次。 */
|
||||
{
|
||||
unsigned logged = 0;
|
||||
int warns = 0;
|
||||
/* (a) 只有 class_num(2) 缺失:连续 30 次(60s @2s) */
|
||||
for (int i = 0; i < 30; i++)
|
||||
if (mf_missing_warn_mask(&logged, 1u << 2)) warns++;
|
||||
check("class missing 60s @2s -> exactly 1 WARN", warns, 1);
|
||||
/* (b) 缺失集合不变(再 30 次):不增长 */
|
||||
for (int i = 0; i < 30; i++)
|
||||
if (mf_missing_warn_mask(&logged, 1u << 2)) warns++;
|
||||
check("class missing unchanged -> no new WARN", warns, 1);
|
||||
/* (c) class_latin(3) 也变缺失:只多 1 次(且只针对新缺失的那一类) */
|
||||
{
|
||||
unsigned fresh = mf_missing_warn_mask(&logged, (1u << 2) | (1u << 3));
|
||||
warns += fresh ? 1 : 0;
|
||||
check("new missing class -> exactly 1 more WARN", fresh, 1u << 3);
|
||||
}
|
||||
check("total WARN after set change", warns, 2);
|
||||
/* (d) class_num(2) 恢复 → 位图缩小但不再打;再次缺失 → 重新打一次 */
|
||||
check("recovered class -> no WARN", mf_missing_warn_mask(&logged, 1u << 3), 0);
|
||||
check("re-missing after recovery -> WARN again",
|
||||
mf_missing_warn_mask(&logged, (1u << 2) | (1u << 3)), 1u << 2);
|
||||
/* (e) 全部恢复 → 位图清零、静默 */
|
||||
check("none missing -> no WARN", mf_missing_warn_mask(&logged, 0), 0);
|
||||
check("logged mask reset", logged, 0);
|
||||
printf(" (旧实现 60s @2s 单类缺失 = 30 行;新实现 = 1 行)\n");
|
||||
}
|
||||
|
||||
printf("\n%d pass, %d fail\n", g_pass, g_fail);
|
||||
return g_fail ? 1 : 0;
|
||||
}
|
||||
Reference in new issue
Block a user