[components][ipc][rb] add utests and fix stability corner cases#11261
[components][ipc][rb] add utests and fix stability corner cases#11261Ryan-CW-Code wants to merge 2 commits 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-18 09:27 CST)
📝 Review Instructions
|
|
|
拉取/合并请求描述:(PR description)
本PR核心内容由 Codex 完成,我仅引导和审查。
为什么提交这份PR (why to submit this PR)
在别的平台使用rt的ringbuf发现
rt_ringbuffer_put_force实现有问题具体表现为当发生覆盖写入时,语义要求“丢弃最旧数据并写入新数据,最终应当是满状态”。旧实现存在一种 wrapped 场景,会导致“满被误判为空”。
可复现的具体场景(旧实现会错):
read_index = 5
write_index = 2
read_mirror = 0
write_mirror = 0
旧逻辑执行:
read_index = 5 + 2 = 7
read_mirror 不变
write_index = 2 + 5 = 7
write_mirror 不变
read_index == write_index == 7
read_mirror == write_mirror == 0
上述状态会被识别为“空”,但实际已经覆盖写入并保持满,这破坏了“索引相等时镜像位必须区分空/满”的不变量。
———
2. 修复思路(理论依据)
新实现保证以下两个不变量始终成立:
根据 drop_length 分三种情况推进 read_index:
如果发生覆盖写入并且最终满足:
write_index == read_index
write_mirror == read_mirror
则强制翻转 write_mirror,使其满足:
write_index == read_index
write_mirror != read_mirror
这样覆盖写入后必被判定为“满”。
———
2. 修复思路(理论依据)
新实现保证以下两个不变量始终成立:
根据 drop_length 分三种情况推进 read_index:
如果发生覆盖写入并且最终满足:
write_index == read_index
write_mirror == read_mirror
则强制翻转 write_mirror,使其满足:
write_index == read_index
write_mirror != read_mirror
这样覆盖写入后必被判定为“满”。
———
优化ringbuf内部断言、添加ringbuf utest
请提供验证的bsp和config (provide the config and bsp)
使用RT-Thread的qemu-vexpress-a9验证
当前拉取/合并请求的状态 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