mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-02 03:49:12 +08:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user