Split LockFreeQueue into base and notifying variants to reduce memory usage

This commit is contained in:
J. Nick Koston 2025-07-05 09:02:33 -05:00
parent dfcc3206f7
commit 62088dfaed
No known key found for this signature in database

View File

@ -126,19 +126,15 @@ template<class T, uint8_t SIZE> class NotifyingLockFreeQueue : public LockFreeQu
if (was_empty) {
// Queue was empty - consumer might be going to sleep, must notify
xTaskNotifyGive(task_to_notify_);
} else {
// Queue wasn't empty - check if consumer has caught up to previous tail
uint8_t head_after = this->head_.load(std::memory_order_acquire);
if (head_after == old_tail) {
} else if (this->head_.load(std::memory_order_acquire) == old_tail) {
// Consumer just caught up to where tail was - might go to sleep, must notify
// Note: There's a benign race here - between reading head_after and calling
// Note: There's a benign race here - between reading head and calling
// xTaskNotifyGive(), the consumer could advance further. This would result
// in an unnecessary wake-up, but is harmless and extremely rare in practice.
xTaskNotifyGive(task_to_notify_);
}
// Otherwise: consumer is still behind, no need to notify
}
}
return result;
}