Browse Source

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.
sbg
Beat Küng 5 years ago committed by Daniel Agar
parent
commit
1fe79818d9
  1. 13
      src/include/containers/IntrusiveQueue.hpp

13
src/include/containers/IntrusiveQueue.hpp

@ -101,9 +101,11 @@ public: @@ -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: @@ -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;
}
}

Loading…
Cancel
Save