Skip to content

Fix[denumerator]: close GFileEnumerator when enumeration finishes#282

Merged
deepin-bot[bot] merged 1 commit intolinuxdeepin:release/eaglefrom
GongHeng2017:202604281931-re-eagle-fix
Apr 29, 2026
Merged

Fix[denumerator]: close GFileEnumerator when enumeration finishes#282
deepin-bot[bot] merged 1 commit intolinuxdeepin:release/eaglefrom
GongHeng2017:202604281931-re-eagle-fix

Conversation

@GongHeng2017
Copy link
Copy Markdown
Contributor

Close and release GFileEnumerator after all entries are consumed to prevent file descriptor leak on GVFS mount points (e.g. Vault).

枚举完成后关闭并释放GFileEnumerator,防止GVFS挂载点(如保险箱)的文件描述符泄漏。

Log: 修复枚举器耗尽后fd未释放的问题
Influence: 修复遍历Vault等GVFS目录后文件描述符一直被占用的问题,枚举完成后正确释放资源。

@GongHeng2017 GongHeng2017 force-pushed the 202604281931-re-eagle-fix branch 4 times, most recently from bc075d1 to 8eef52b Compare April 28, 2026 13:41
@GongHeng2017 GongHeng2017 force-pushed the 202604281931-re-eagle-fix branch from 8eef52b to fb0cc12 Compare April 28, 2026 13:51
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

#帕奇(Sparky)代码审查报告

1. 语法逻辑分析

  • 版权年份更新SPDX-FileCopyrightText2020 - 2023 更新为 2020 - 2026。这是一个常规的版权年份更新,语法正确。
  • hasNext() 函数逻辑变更:在 denumerator.cpphasNext() 函数中,当枚举完成时(即函数返回 false 之前),新增了一段代码用于关闭和释放 GFileEnumerator 资源。
    • 逻辑上,当 hasNext() 返回 false 时,表示没有更多项可以枚举,此时释放枚举器资源是合理的。
    • 使用了 stackEnumerator.pop() 获取并移除栈顶元素,然后检查指针有效性并关闭/释放资源,逻辑正确。

2. 代码质量

  • 资源管理改进:新增的代码显式地关闭和释放了 GFileEnumerator 资源,这是一个很好的改进,避免了潜在的内存泄漏和文件描述符泄漏。
  • 代码清晰度:注释清晰地说明了代码的意图("枚举完成,关闭并释放当前枚举器,释放 fd"),有助于后续维护。
  • 一致性:使用了 GLib 的标准函数 g_file_enumerator_closeg_object_unref 来管理资源,与项目中其他 GLib 对象的使用方式保持一致。

3. 代码性能

  • 性能影响:新增的代码只在枚举完成时执行一次,对性能的影响可以忽略不计。
  • 资源释放效率:及时释放资源(文件描述符)有助于系统资源的高效利用,长期来看可能提升系统整体性能。

4. 代码安全

  • 资源泄漏防护:通过显式关闭和释放 GFileEnumerator,避免了文件描述符泄漏的风险,这在长时间运行的程序中尤为重要。
  • 空指针检查:代码中包含了 if (enumerator) 检查,防止了对空指针的解引用,增强了安全性。
  • 线程安全hasNext() 是一个 const 成员函数,但内部修改了 d->stackEnumerator(通过 pop())。虽然 d 指针指向的是私有实现(Pimpl 模式),但 const 成员函数修改内部状态可能会引起混淆。建议:
    • 如果 hasNext() 需要修改内部状态,考虑移除 const 限定符。
    • 或者,如果 const 语义必须保留,确保 stackEnumerator 被标记为 mutable

5. 改进建议

  1. const 正确性

    • 当前 hasNext() 被声明为 const,但内部调用了 pop() 修改了 stackEnumerator。建议:
      • 选项 A:移除 hasNext()const 限定符。
      • 选项 B:如果必须保持 const 语义,将 stackEnumerator 声明为 mutable
    • 示例(选项 A):
      bool DEnumerator::hasNext()  // 移除 const
      {
          // ... 现有代码 ...
      }
  2. 错误处理

    • g_file_enumerator_close 的错误参数被设置为 nullptr,这意味着忽略关闭时的错误。如果关闭操作可能失败且需要处理错误,可以考虑添加错误处理逻辑。
    • 示例:
      GError *error = nullptr;
      if (!g_file_enumerator_close(enumerator, nullptr, &error)) {
          qWarning() << "Failed to close enumerator:" << error->message;
          g_error_free(error);
      }
  3. RAII 封装

    • 考虑使用 RAII(资源获取即初始化)模式封装 GFileEnumerator,例如创建一个智能指针包装器,自动管理资源的释放。这样可以减少手动资源管理的代码,降低出错风险。
    • 示例(伪代码):
      struct GFileEnumeratorDeleter {
          void operator()(GFileEnumerator *enumerator) const {
              if (enumerator) {
                  g_file_enumerator_close(enumerator, nullptr, nullptr);
                  g_object_unref(enumerator);
              }
          }
      };
      using GFileEnumeratorPtr = std::unique_ptr<GFileEnumerator, GFileEnumeratorDeleter>;

6. 总结

这次修改主要改进了资源管理,及时释放了不再需要的 GFileEnumerator 资源,是一个有益的改进。主要关注点是 const 正确性和潜在的改进空间(如 RAII 封装)。整体上,代码质量较高,逻辑清晰,安全性良好。

Close and release GFileEnumerator after all entries are consumed
to prevent file descriptor leak on GVFS mount points (e.g. Vault).

枚举完成后关闭并释放GFileEnumerator,防止GVFS挂载点(如保险箱)的文件描述符泄漏。

Log: 修复枚举器耗尽后fd未释放的问题
Bug: https://pms.uniontech.com/bug-view-358881.html
Influence: 修复遍历Vault等GVFS目录后文件描述符一直被占用的问题,枚举完成后正确释放资源。
@GongHeng2017 GongHeng2017 force-pushed the 202604281931-re-eagle-fix branch from fb0cc12 to a438e1f Compare April 29, 2026 01:15
@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: GongHeng2017, liyigang1, max-lvs

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@GongHeng2017
Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot
Copy link
Copy Markdown

deepin-bot Bot commented Apr 29, 2026

This pr force merged! (status: unstable)

@deepin-bot deepin-bot Bot merged commit ec1d88f into linuxdeepin:release/eagle Apr 29, 2026
20 of 21 checks passed
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.

4 participants