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 (;;) {
|
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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue