Deadlock between Watcher and Debounce threads (fix #187) #189
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.
fix #187
There are two threads involved in
Watcher.cc
andDebounce.cc
eachcalling into respective methods of the other and thus each potentially
holding onto locks of the other. This can lead to a deadlock in the
following scenario:
While the
Debounce.cc
thread is processing callbacks in theDebounce::notify()
method, it holds its own lock. The method loopsover callbacks to process in
Watcher.cc
which itself requires a lockin
Watcher.cc
. If an event gets reported while the debouncer is inWatcher.triggerCallbacks()
, a deadlock is present, because:Watcher::notify()
and calls intoDebounce.trigger()
which requires the debouncer lockDebounce::notify()
holding its own lockprocessing callbacks and about to call into
Watcher.triggerCallbacks()