Fix another deadlock in sensors system #2141
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.
🦟 Bug fix
Summary
This PR:
updateAvailable
variable with a condition variable while that variable is also being written.Reduced scope of a lock (timeLock
). Not needed for fixing deadlock - can be done in a separate PR if needed.More info on the deadlock:
These two operations can happen concurrently (from 2 threads):
The
wait
condition may miss thenotify_one()
call causing it to sleep forever. To solve this, we need to make sure these two groups of operations are performed one after another. This fix is to group and lock theupdateAvailable = [true|false]
andnotify_one
calls using the same lock that's used by thewait
condition variable.Test it
Ran into this deadlock when adding the DvL sensor system to the Harmonic demo world. The DVL sensor is implemented as a custom rendering sensor. It changes the timing of the sensors system which revealed this deadlock issue.
Test with this pull request that adds a DVL sensor to the harmonic demo world:
gazebosim/harmonic_demo#9
Without the changes in this PR, the deadlock happens within 1 minute of running the simulation for me.
Checklist
codecheck
passed (See contributing)Note to maintainers: Remember to use Squash-Merge and edit the commit message to match the pull request summary while retaining
Signed-off-by
messages.