From f451015d3bd85e8c7c4725becb7da13c8ade3b0d Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Tue, 1 Apr 2014 13:46:10 +0400 Subject: [PATCH] Fixed linked list traversing in Dispatcher --- libuavcan/src/transport/dispatcher.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libuavcan/src/transport/dispatcher.cpp b/libuavcan/src/transport/dispatcher.cpp index 244bf17c0d..932bf4446d 100644 --- a/libuavcan/src/transport/dispatcher.cpp +++ b/libuavcan/src/transport/dispatcher.cpp @@ -62,7 +62,7 @@ void LoopbackFrameListenerRegistry::invokeListeners(RxFrame& frame) while (p) { LoopbackFrameListenerBase* const next = p->getNextListNode(); - p->handleLoopbackFrame(frame); + p->handleLoopbackFrame(frame); // p may be modified p = next; } } @@ -113,8 +113,9 @@ void Dispatcher::ListenerRegistry::cleanup(MonotonicTime ts) TransferListenerBase* p = list_.get(); while (p) { - p->cleanup(ts); - p = p->getNextListNode(); + TransferListenerBase* const next = p->getNextListNode(); + p->cleanup(ts); // p may be modified + p = next; } } @@ -123,15 +124,16 @@ void Dispatcher::ListenerRegistry::handleFrame(const RxFrame& frame) TransferListenerBase* p = list_.get(); while (p) { + TransferListenerBase* const next = p->getNextListNode(); if (p->getDataTypeDescriptor().getID() == frame.getDataTypeID()) { - p->handleFrame(frame); + p->handleFrame(frame); // p may be modified } else if (p->getDataTypeDescriptor().getID() < frame.getDataTypeID()) // Listeners are ordered by data type id! { break; } - p = p->getNextListNode(); + p = next; } }