From 1fe79818d9713567eedf91e0ebb344e4759bd515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Thu, 19 Mar 2020 07:19:04 +0100 Subject: [PATCH] fix IntrusiveQueue::remove: several bugs that led to improper state of the queue We also have to set removeNode->next to null, as it is used to test if the item is in the queue. --- src/include/containers/IntrusiveQueue.hpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/include/containers/IntrusiveQueue.hpp b/src/include/containers/IntrusiveQueue.hpp index 47f2099725..e39e932034 100644 --- a/src/include/containers/IntrusiveQueue.hpp +++ b/src/include/containers/IntrusiveQueue.hpp @@ -101,9 +101,11 @@ public: if (removeNode == _head) { if (_head->next_intrusive_queue_node() != nullptr) { _head = _head->next_intrusive_queue_node(); + removeNode->set_next_intrusive_queue_node(nullptr); } else { _head = nullptr; + _tail = nullptr; } return true; @@ -112,14 +114,13 @@ public: for (T node = _head; node != nullptr; node = node->next_intrusive_queue_node()) { // is sibling the node to remove? if (node->next_intrusive_queue_node() == removeNode) { - // replace sibling - if (node->next_intrusive_queue_node() != nullptr) { - node->set_next_intrusive_queue_node(node->next_intrusive_queue_node()->next_intrusive_queue_node()); - - } else { - node->set_next_intrusive_queue_node(nullptr); + if (removeNode == _tail) { + _tail = node; } + // replace sibling + node->set_next_intrusive_queue_node(removeNode->next_intrusive_queue_node()); + removeNode->set_next_intrusive_queue_node(nullptr); return true; } }