Elide the wait if the queue head is already non-null
This commit is contained in:
parent
edf1838708
commit
71c9ff0d91
1 changed files with 8 additions and 3 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue