Nullify pointer to ClientListener in CustomClientInfo in destructor #205
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.
This mitigates (does not fix) a race condition when one thread calls
rmw_wait()
and another callsrmw_destroy_client()
. Whenrmw_wait()
wakes up it callsCustomClientInfo->listener_
, but both the instance ofCustomClientInfo
and the object pointed to bylistener_
have been destroyed. This nulls the fieldlistener_
and hasrmw_wait()
check this field before using it to reduce the likelyhood of a crash.I observed this race condition while debugging a CI test failure in ros2/rclcpp#488. The symptom seen is a SIGABRT on OSX when trying to lock
ClientListener.internalMutex_
.I'm not sure what a real fix would look like.
rmw_wait()
needs a way to tell the client it is holding onto has been destroyed. The other entities appear to be using the same pattern, so I suspect they suffer from similar race conditions too. (ticket to follow)