fix(tuku): 评审 P2-1/P2-2——解压页与缩略图缓存互删自愈 + 大页溢出文档化
P2-1(必修):解压页缓存与缩略图 LRU 在 *.bmp 上相互踩踏 - ui/library 的 cache_prune 先按 page_cache 的共用判据 mr_cache_is_page_name 跳过 mrpage_*,不再把 BMP 解压页算进缩略图额度或 unlink(含 Vol10.cbz 这类 BMP 档不再出现「被缩略图 LRU 删掉 → 首页解码失败」); - mr_cache_touch 命中时 stat 校验文件存在与大小,缺失/尺寸不符即移出索引并按 未命中返回,调用方重新解压——外部清理/掉电残留/误删都能自愈,不再返回死路径。 P2-2(文档化一次性溢出): - page_cache.h 与 make_room_locked 写明:单条目本身超过 32MiB 时只保留该条、 其它全部淘汰,占用上限受页源单页 64MiB(MR_ZIP_PAGE_MAX_BYTES)约束; 大页仍可读,不因预算拒绝落缓存。 - 新增 33MiB 页夹具(PNG 头 + 可压零填充,deflate 后仅数十 KB)与断言: 大页可读、cache_bytes 允许超 32MiB、小页被淘汰、再来小页时大页按预算淘汰。 顺手:page_cache.h 注释包名 os.meow.picobrowser → os.meow.picbrowser(测试路径同步)。 测试:test_cbz 267 → 296 项全 PASS;run_tests.sh(zip 106)与 run_webtoon_tests.sh 全绿;交叉构建 sdk/tuku 零警告,产物静态 MIPS32r2 ELF。
This commit is contained in:
1 parent
562cc44931
commit
c775f8558c
5 files changed
+125
-13
No files matched your search
@@ -32,6 +32,7 @@ import zipfile
|
||||
import zlib
|
||||
|
||||
DATE = (2024, 1, 1, 0, 0, 0)
|
||||
HUGE_PAGE_LEN = 33 * 1024 * 1024 # > 32MiB 预算:锁定「单条目一次性溢出」行为
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 图片构造
|
||||
@@ -190,6 +191,14 @@ def build_features(ro):
|
||||
with open(os.path.join(feat, "truncated.cbz"), "wb") as f:
|
||||
f.write(raw[:len(raw) // 2])
|
||||
|
||||
# 单页 33MiB(PNG 头 + 可压零填充,deflate 后只有几十 KB):
|
||||
# 页过滤放行(< 64MiB),解压后落缓存时应允许一次性超过 32MiB 预算。
|
||||
head = png_bytes(64, 64, 31)
|
||||
payload = head + b"\x00" * (HUGE_PAGE_LEN - len(head))
|
||||
write_zip(os.path.join(feat, "hugepage.cbz"), [
|
||||
("huge.png", payload, zipfile.ZIP_DEFLATED),
|
||||
])
|
||||
|
||||
|
||||
def write_manifest(ro):
|
||||
"""每档案每条目:<相对路径>\t<条目名>\t<crc32>\t<size>(Tab 分隔,UTF-8 原名)。"""
|
||||
@@ -198,6 +207,8 @@ def write_manifest(ro):
|
||||
for name in sorted(files):
|
||||
if not name.lower().endswith((".cbz", ".zip")):
|
||||
continue
|
||||
if name == "hugepage.cbz":
|
||||
continue # 33MiB 页只为缓存溢出测试,manifest 不校验它
|
||||
path = os.path.join(base, name)
|
||||
rel = os.path.relpath(path, ro)
|
||||
try:
|
||||
|
||||
Reference in new issue
Block a user