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 (;;) { for (;;) {
err = PltWaitForEvent(&queueHead->containsDataEvent); // We can also avoid a syscall if the head pointer is non-NULL.
if (err != PLT_WAIT_SUCCESS) { // It's not safe to dereference the value due to potential memory
return LBQ_INTERRUPTED; // 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) { if (queueHead->shutdown) {