Skip to content

[0178] 修复 mupdf 渲染器 register_pattern 的内存泄漏#3586

Open
da-liii wants to merge 4 commits into
mainfrom
da/0178/mupdf_meme
Open

[0178] 修复 mupdf 渲染器 register_pattern 的内存泄漏#3586
da-liii wants to merge 4 commits into
mainfrom
da/0178/mupdf_meme

Conversation

@da-liii
Copy link
Copy Markdown
Contributor

@da-liii da-liii commented May 31, 2026

任务描述

基于 0177 的内存监控能力,采用 TDD 方式查找并修复 mupdf 渲染器中的内存泄漏问题。

改动内容

Commit 1: 任务文档

  • 新增 devel/0178.md

Commit 2: 复现内存泄漏的单元测试

  • 新增 tests/Plugins/MuPDF/mupdf_renderer_test.cpp
  • 修复 format_picsize_string 在无 GUI 环境下调用 get_current_editor 崩溃的问题,使测试可在 headless 环境中运行

Commit 3: 修复内存泄漏

src/Plugins/MuPDF/mupdf_renderer.cppregister_pattern 中修复三处内存泄漏:

  1. buffer processor 泄漏pdf_new_buffer_processor 创建的 processor 仅被 pdf_close_processor 关闭,未被 pdf_drop_processor 释放
  2. pdf_dict (xres) 泄漏pdf_dict_puts(ctx, subres, "XObject", xres) 后未调用 pdf_drop_obj(ctx, xres) 释放原始引用
  3. pdf_pattern 泄漏:手动创建的 pdf_pattern 使用 fz_malloc_struct 分配(清零),但未初始化 storable.drop 函数指针。pdf_drop_pattern 在引用计数降至 0 时因 drop 为 NULL 而无法释放 patresourcescontents

修复方案:

  • pdf_close_processor 后添加 pdf_drop_processor
  • pdf_dict_puts 后添加 pdf_drop_obj(ctx, xres)
  • 定义 mupdf_pattern_drop_imp 作为手动创建 pattern 的释放函数,并使用 FZ_INIT_STORABLE 初始化 pat
  • 移除 register_pattern 中多余的 pdf_drop_pattern(ctx, pat) 调用,让 mupdf_pattern 的引用计数管理接管生命周期

测试验证

xmake b mupdf_renderer_test && xmake r mupdf_renderer_test

测试通过,RSS 增长稳定,内存泄漏已修复。

🤖 Generated with Claude Code

da-liii and others added 4 commits May 31, 2026 12:18
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 新增 mupdf_renderer_test,通过 RSS 监控检测 register_pattern 的内存泄漏
- 修复 format_picsize_string 在无 GUI 环境下调用 get_current_editor 崩溃的问题,
  使测试可在 headless 环境中运行

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1. 在 pdf_close_processor 后添加 pdf_drop_processor,释放 buffer processor
2. 在 pdf_dict_puts 后添加 pdf_drop_obj(ctx, xres),释放 xres 原始引用
3. 定义 mupdf_pattern_drop_imp 作为手动创建 pattern 的释放函数
4. 使用 FZ_INIT_STORABLE 初始化 pdf_pattern 的 storable.drop
5. 移除 register_pattern 中多余的 pdf_drop_pattern 调用,
   让 mupdf_pattern 的引用计数管理接管生命周期

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 按照 dddd.md 模板重新组织文档结构
- 在如何测试部分补充普通用户可验证的场景:
  创建带有 pattern brush 的文档并反复导出 PDF,
  观察内存占用是否稳定

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant