Summary: Consider a case we found that the queue is empty and unlocked and before our setActive(false) from SCOPE_EXIT gets called (or gets the lock) putMessageImpl got the lock. Now putMessage thinks that we donot want to add another signal but actually we do.
Test Plan:
Running mcreplay2 without running into this problem on a box.
Benchmark:
Reviewed By: davejwatson@fb.com
FB internal diff:
D1428249
try {
if (UNLIKELY(queue_->queue_.empty())) {
// If there is no message, we've reached the end of the queue, return.
+ setActive(false);
queue_->spinlock_.unlock();
return;
}