[components][ipc][workqueue] 完善 workqueue 同步语义、生命周期收敛与 delayed 队列处理#11285
[components][ipc][workqueue] 完善 workqueue 同步语义、生命周期收敛与 delayed 队列处理#11285Ryan-CW-Code wants to merge 1 commit intoRT-Thread:masterfrom
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: componentsReviewers: @Maihuanyi Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-03-21 18:20 CST)
📝 Review Instructions
|
拉取/合并请求描述:(PR description)
workqueue 我在非RTT平台使用的比较多,这次结合之前的经验配合 Codex 尝试进行优化
本PR核心内容由 Codex 完成,我仅引导和审查。
Workqueue PR 说明
components/drivers/ipc/workqueue.c、components/drivers/include/ipc/workqueue.h、components/drivers/ipc/utestworkqueue同步语义与并发边界,收敛 delayed/cancel/destroy 热路径,并保证 API 语义稳定1. 背景
现有
workqueue在 running work 生命周期、同步取消、同步销毁、跨队列操作和 delayed 队列处理上存在语义空洞与边界不清的问题。典型问题包括:cancel_work_sync()、destroy_sync()缺少完整的等待语义与上下文约束。2. 问题描述
本次变更重点解决以下问题:
cancel_work_sync()、destroy_sync()的合法调用上下文、阻塞条件与返回值。3. 方案概述
3.1 生命周期与队列绑定
work->workqueue绑定。submit、urgent、cancel、cancel_sync遇到“work 已绑定其他 queue”统一返回-RT_EBUSY。3.2 同步取消
RT_WORK_STATE_CANCELING。cancel_work_sync()命中 running work 时,先标记 canceling,再等待当前执行结束。cancel_work_sync()仅在“真的需要等待 running work”时才要求 scheduler 可用。3.3 同步销毁
rt_workqueue_destroy_sync()。thread->cleanup或外部强删 worker,而由 worker 在线程入口自然收敛退出。3.4 delayed 队列与热路径
work_list。cancel_all、destroy、destroy_sync采用“锁内摘链、锁外逐项清理”。wakeup_completion保持在锁外执行,避免拉长锁内路径。3.5 状态与系统接口
rt_workqueue_get_work_status()。rt_work_cancel_sync()与rt_work_get_status()。urgent与立即submit共用提交核心,仅保留插队位置差异。4. 行为变化与兼容性
4.1 行为变化
work->workqueue保持非空。cancel_work_sync()、destroy_sync()仅允许线程上下文调用,且禁止在对应 worker 线程内调用。destroy()保持异步语义,destroy_sync()保持同步等待 worker 退出语义。cancel_all()仅清理 queued/delayed work,不等待 running work 完成。4.2 兼容性说明
work->workqueue == RT_NULL”旧行为的代码需要调整。-RT_EBUSY。struct rt_work、struct rt_workqueue字段,不引入结构体 ABI 膨胀。5. 资源与实现取舍
ref_count。destroy_sync()完成。6. 风险与注意事项
rt_workqueue_destroy()返回后,调用方仍不能继续使用原 queue 指针。rt_workqueue_cancel_all_work()不是同步屏障,不保证当前 running work 已经结束。-RT_EBUSY,可能误判同步取消、销毁或跨队列操作已成功。destroy()返回后继续并发访问旧 queue 仍属于越界使用。7. 测试覆盖
7.1 用例统计
workqueue_tc_basic.c:13 个用例workqueue_tc_cancel.c:18 个用例workqueue_tc_destroy.c:8 个用例workqueue相关用例7.2 覆盖场景汇总
urgent插队、urgent 与 delayed 交互rt_work_submit()、rt_work_urgent()、rt_work_cancel()、rt_work_cancel_sync()、rt_work_get_status()7.3 当前未覆盖项
8. 验证方式
menuconfig中启用对应utest。当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up