Fix cleanup of indirect messages when a child is removed. (#1052)

- Allow cleanup even when mSendBusy is true.
- Set mSendMessage to NULL to indicate that the message has been freed.
- In HandleSentFrame(), simply schedule next transmission if mSendMessage is NULL.
This commit is contained in:
Jonathan Hui
2016-12-08 10:21:26 -08:00
committed by GitHub
parent 1d999ccea3
commit ef58caf19b
+11 -6
View File
@@ -187,8 +187,6 @@ void MeshForwarder::UpdateIndirectMessages(void)
Child *children;
uint8_t numChildren;
VerifyOrExit(mSendBusy == false,);
children = mMle.GetChildren(&numChildren);
for (uint8_t i = 0; i < numChildren; i++)
@@ -209,6 +207,11 @@ void MeshForwarder::UpdateIndirectMessages(void)
if (!message->IsChildPending())
{
if (mSendMessage == message)
{
mSendMessage = NULL;
}
mSendQueue.Dequeue(*message);
message->Free();
}
@@ -217,9 +220,6 @@ void MeshForwarder::UpdateIndirectMessages(void)
child->mQueuedIndirectMessageCnt = 0;
ClearSrcMatchEntry(*child);
}
exit:
return;
}
void MeshForwarder::ScheduleTransmissionTask()
@@ -1255,7 +1255,12 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
Neighbor *neighbor;
mSendBusy = false;
VerifyOrExit(mSendMessage != NULL, ;);
if (mSendMessage == NULL)
{
mScheduleTransmissionTask.Post();
ExitNow();
}
aFrame.GetDstAddr(macDest);