Elide the wait if the queue head is already non-null

This commit is contained in:
Cameron Gutman 2021-05-15 21:31:45 -05:00
parent edf1838708
commit 71c9ff0d91

View File

@ -184,9 +184,14 @@ int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data) {
}
for (;;) {
err = PltWaitForEvent(&queueHead->containsDataEvent);
if (err != PLT_WAIT_SUCCESS) {
return LBQ_INTERRUPTED;
// We can also avoid a syscall if the head pointer is non-NULL.
// It's not safe to dereference the value due to potential memory
// ordering hazards, but we can use its presence to elide the wait.
if (queueHead->head == NULL) {
err = PltWaitForEvent(&queueHead->containsDataEvent);
if (err != PLT_WAIT_SUCCESS) {
return LBQ_INTERRUPTED;
}
}
if (queueHead->shutdown) {