Avoid device_watcher deadlock after reset #11933
Closed
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.
Fixing: #10482
Issue:
Root cause:
on_device_changed()
callback~device()
is getting called in different threadon_device_changed()
callback and destructor~device()
runs at same time in different threads, deadlock happens as both of their call stacks require same set of mutexes but in different order_dispatch_mutex
at line and following the callstack it calls theon_device_changed()
callback and waits for mutex_devices_changed_callbacks_mtx
at line~device()
destructor is called and then, it callsunregister_internal_device_callback()
function at line_devices_changed_callbacks_mtx
at linedevice_watcher->stop()
, which callsdispatcher::stop()
_dispatch_mutex
at lineProposed Fix:
on_device_changed()
callback. If the timeout happens, this callback can be stopped - which will in turn resumes the other thread as well