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:
AskaEth committed 2026-11-12 08:02:22 +08:00
1 parent 166b32d0e5
commit 0d6c56100f
5 files changed
+93 -4

No files matched your search

+22 -2
View File
@@ -3,6 +3,10 @@
#include "meow_launcher_internal.h"
#include "mf_logsig.h" /* M52:多字体日志只在配置签名跃迁时打(纯函数,宿主单测) */
/* M52 r2:class 缺失 WARN 的跃迁位图是 32 位 unsigned(见 meow_font_reload_multifont)。
* 类别数一旦超过 32,高位会被静默丢掉(= 该类的 WARN 不再打)——编译期钉死。 */
_Static_assert(MEOW_FCLS_COUNT <= 32, "mf_missing_warn_mask assumes <= 32 font classes");
/* M2.6 字重结构 + M2.8 三级定案(FONT_SYSTEM):卡内字体 =
* <卡根>/MeowOS/fonts/<family>/<weight>/(两级,向后兼容)或
* <卡根>/MeowOS/fonts/<family>/<weight>/<tier>/(三级,tier=common/gbk/full)。
@@ -304,6 +308,7 @@ void meow_font_reload_multifont(void)
static char cpng[MEOW_FCLS_COUNT][400], cidx[MEOW_FCLS_COUNT][400];
meow_font_class_cfg cfg[MEOW_FCLS_COUNT];
memset(cfg, 0, sizeof cfg);
unsigned miss_now = 0; /* 本轮「配置了但缺失/不可读」的类别位图(M52 r2:见下方门控) */
for (int c = 0; c < MEOW_FCLS_COUNT; c++) {
char ref[MEOW_SET_MAX_LEN];
if (meow_settings_get_str(cls_keys[c], ref, sizeof ref) == 0 && ref[0]) {
@@ -317,11 +322,26 @@ void meow_font_reload_multifont(void)
}
cfg[c].png = cpng[c]; cfg[c].idx = cidx[c];
} else {
/* M2.58:类别字体配置了但缺失 → 该类别回退全局,并记系统 WARN。 */
logmsg("multi_font: class %s font %s missing, fallback global", cls_keys[c], ref);
/* M2.58:类别字体配置了但缺失 → 该类别回退全局(回退行为不变)。
* M52 r2(r1 评审 P2-1):这条 WARN 也在这条 2s 热路径上,旧实现每轮每类
* 各打一条(最多 6 行/2s = 3 行/s,比刚修掉的 enabled 行凶 6 倍)。改成
* 「只记位图、跃迁时才打」——判定在循环外统一做,日志文本与参数不变。 */
miss_now |= 1u << c;
}
}
}
/* 新出现缺失的类别才打(缺失集合不变 → 静默;恢复后再缺失 → 会再打一次)。 */
{
static unsigned mfont_miss_logged;
unsigned fresh = mf_missing_warn_mask(&mfont_miss_logged, miss_now);
for (int c = 0; c < MEOW_FCLS_COUNT; c++) {
if (!(fresh & (1u << c))) continue;
char ref[MEOW_SET_MAX_LEN];
/* 跃迁是稀有事件:这里重读一次 settings 复原原始相对路径(不占热路径) */
if (meow_settings_get_str(cls_keys[c], ref, sizeof ref) != 0) ref[0] = 0;
logmsg("multi_font: class %s font %s missing, fallback global", cls_keys[c], ref);
}
}
int distinct = 0, truncated = 0;
int rc = meow_font_config_multifont(on, gpng, gidx, cfg, &distinct, &truncated);
/* M52(日志刷屏):本函数被主循环 hotplug 轮询每 2s 调一次,配置绝大多数周期不变。