fix(can): Resolve potential race condition in message transmission#10896
fix(can): Resolve potential race condition in message transmission#10896Rbb666 merged 1 commit intoRT-Thread:masterfrom
Conversation
Setting the send status flag `sndchange` after calling the can->ops->sendmsg function could lead to a race condition if a transmission timeout occurs, resulting in incorrect state handling. This patch moves the operation of setting the `sndchange` flag to before the call to can->ops->sendmsg. This ensures that the mailbox's status is correctly marked as "sending" before the hardware begins transmission, making the driver's state management more robust and reliable, especially in handling exceptions like timeouts. Additionally, new macros for CAN filter modes have been added in dev_can.h.
|
👋 感谢您对 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)
🏷️ Tag: components_driver_canReviewers: @wdfk-prog Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2025-11-05 16:02 CST)
📝 Review Instructions
|
|
lgtm |
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
当前的 CAN 驱动在发送消息时,发送状态标志位
sndchange是在底层硬件发送函数can->ops->sendmsg被调用之后才设置的。这在发送超时的场景下可能会引发竞态问题,导致驱动对发送状态的判断和处理出现错误,影响通信的稳定性。你的解决方案是什么 (what is your solution)
为了解决这个潜在的竞态问题,本 PR 对代码进行了调整,将
sndchange标志位的设置操作移动到了调用can->ops->sendmsg函数之前。这样的修改可以确保:一旦驱动决定使用某个邮箱进行发送,就会立即将其标记为“发送中”状态。这使得驱动的状态管理更加严谨和健壮,能够正确处理发送超时等异常情况。
此外,本次提交还在头文件
dev_can.h中添加了RT_CAN_MODE_MASK和RT_CAN_MODE_LIST宏定义,为后续的 CAN 过滤器模式配置做准备。请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 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