消息队列接收与紧急发送代码修改 #1

Merged
smileyk merged 1 commits from msg_que_modifications into master 2026-04-03 17:32:46 +08:00
Member

问题1描述

msgqueue.c的_MsgQueueRecv函数中,条件判断mq->index==0 && timeout == 0为真时,会返回接收超时错误,但此时消息队列中可能是存在消息的。

问题1复现步骤

  1. 通过函数_InitMsgQueue创建消息队列
  2. 通过函数_MsgQueueSend向队列中发送一个消息
  3. 调用_MsgQueueRecv接收消息,此时会返回超时错误而不是收到上一步发送的消息

根本原因

借助mq->index==0对循环队列判空

修复方案

将问题描述中的条件判断mq->index==0 && timeout == 0改为timeout == 0 && mq->num_msgs <= 0

问题2描述

msgqueue.c的_MsgQueueUrgentSend函数中,先对mq->index(消息接收位置)自减,再基于其新值,利用msg = mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len计算要将消息发送到的目标位置时出错。新消息会被发送至队尾而不是队头位置,且新消息可能覆盖已有消息。

问题2复现步骤

  1. 假设消息队列中已经有一个消息,则mq->index指向该消息
  2. 调用_MsgQueueUrgentSend,本应将消息发送到第一步中所述消息的前一个位置,但实际会让新消息覆盖掉第一步中所述消息

根本原因

计算消息发送到的目标位置的表达式mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len有误

修复方案

将计算目标位置的表达式改为mq->msg_buf + (mq->index % mq->max_msgs) * mq->each_len

## 问题1描述 msgqueue.c的_MsgQueueRecv函数中,条件判断mq->index==0 && timeout == 0为真时,会返回接收超时错误,但此时消息队列中可能是存在消息的。 ## 问题1复现步骤 1. 通过函数_InitMsgQueue创建消息队列 2. 通过函数_MsgQueueSend向队列中发送一个消息 3. 调用_MsgQueueRecv接收消息,此时会返回超时错误而不是收到上一步发送的消息 ## 根本原因 借助mq->index==0对循环队列判空 ## 修复方案 将问题描述中的条件判断mq->index==0 && timeout == 0改为timeout == 0 && mq->num_msgs <= 0 ## 问题2描述 msgqueue.c的_MsgQueueUrgentSend函数中,先对mq->index(消息接收位置)自减,再基于其新值,利用msg = mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len计算要将消息发送到的目标位置时出错。新消息会被发送至队尾而不是队头位置,且新消息可能覆盖已有消息。 ## 问题2复现步骤 1. 假设消息队列中已经有一个消息,则mq->index指向该消息 2. 调用_MsgQueueUrgentSend,本应将消息发送到第一步中所述消息的前一个位置,但实际会让新消息覆盖掉第一步中所述消息 ## 根本原因 计算消息发送到的目标位置的表达式mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len有误 ## 修复方案 将计算目标位置的表达式改为mq->msg_buf + (mq->index % mq->max_msgs) * mq->each_len
lixm added 1 commit 2026-04-03 17:17:34 +08:00
smileyk merged commit fac4d80e9d into master 2026-04-03 17:32:46 +08:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: chos/crtos#1
No description provided.