Prevent some compiler optimizations #136
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Describe your changes
Notable bugs found
quantum_spinlock_util_impl.h:329
inspinWaitWriter()
the closing parenthesis was in the wrong place.lockRead, lockWrite and upgradeToWriteImpl
the check forspinWaitReader
andspinWaitWriter
was checking against!= Attempt::Once
instead of==Attempt::Unlimited
. When upgrading coroutines to write, the attempt is set toAttempt::Reentrant
which was causing the coroutine to enter this spinwait loop. Since this spin wait loop does not yield the coroutine, the first coroutine being upgraded would take the lock, waiting for all other coroutine readers to either upgrade or release their read locks. However since all other coroutines could never run (because of the non-yield) this would result in a deadlock. PreviousupgradeToWrite
tests only involved scenarios with threads which did not have this problem. A different test using coroutines is now added to check proper behavior in both cases.Signed-off-by: Alexander Damian adamian@bloomberg.net
Testing performed