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.
This commit is contained in:
Beat Küng
2020-03-19 07:19:04 +01:00
committed by Daniel Agar
parent 336745f9f7
commit 1fe79818d9
+7 -6
View File
@@ -101,9 +101,11 @@ public:
if (removeNode == _head) { if (removeNode == _head) {
if (_head->next_intrusive_queue_node() != nullptr) { if (_head->next_intrusive_queue_node() != nullptr) {
_head = _head->next_intrusive_queue_node(); _head = _head->next_intrusive_queue_node();
removeNode->set_next_intrusive_queue_node(nullptr);
} else { } else {
_head = nullptr; _head = nullptr;
_tail = nullptr;
} }
return true; return true;
@@ -112,14 +114,13 @@ public:
for (T node = _head; node != nullptr; node = node->next_intrusive_queue_node()) { for (T node = _head; node != nullptr; node = node->next_intrusive_queue_node()) {
// is sibling the node to remove? // is sibling the node to remove?
if (node->next_intrusive_queue_node() == removeNode) { if (node->next_intrusive_queue_node() == removeNode) {
// replace sibling if (removeNode == _tail) {
if (node->next_intrusive_queue_node() != nullptr) { _tail = node;
node->set_next_intrusive_queue_node(node->next_intrusive_queue_node()->next_intrusive_queue_node());
} else {
node->set_next_intrusive_queue_node(nullptr);
} }
// replace sibling
node->set_next_intrusive_queue_node(removeNode->next_intrusive_queue_node());
removeNode->set_next_intrusive_queue_node(nullptr);
return true; return true;
} }
} }