Make sure timer is fini'd before clock #553
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.
This PR makes sure timers are finalized before clocks. Since a timer uses a clock, the clock must be valid longer than the timer.
I suspect this will fix the windows test failures in ros2/rcl#286. That PR adds a time jump callback to the clock in
rcl_timer_init()
, and removes it inrcl_timer_fini()
. If the clock is finalized before the timer then the attempt to remove the jump callback results in trying to access anrcl_clock_t
after it has been freed.TimerBase
already has a shared pointer toClock
for this purpose, but this is insufficient.TimerBase::get_timer_handle()
returns anstd::shared_ptr<rcl_timer_t>
with a deleter that callsrcl_timer_fini()
. This handle can live longer thanTimerBase
in an executor's memory strategy. SpecificallyAllocatorMemoryStrategy
keeps a list ofstd::shared_ptr<rcl_timer_t>
. If theNodeClock
andTimerBase
are destroyed before anExecutor
then the clock is finalized before the timer handle which may result in a crash.CI
blocks ros2/rcl#286