From 8d2baa6db0aaae82977c6523b18483b284ea5e00 Mon Sep 17 00:00:00 2001 From: mauropasse Date: Fri, 11 Mar 2022 04:35:15 +0000 Subject: [PATCH] If timer canceled, rcl_timer_get_time_until_next_call returns TIMER_CANCELED (#963) * Return TIMER_CANCELED rcl_timer_get_time_until_next_call Signed-off-by: Mauro Passerino --- rcl/include/rcl/timer.h | 1 + rcl/src/rcl/timer.c | 10 ++++++++-- rcl/test/rcl/test_timer.cpp | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rcl/include/rcl/timer.h b/rcl/include/rcl/timer.h index 1bf9212d7..8316645a1 100644 --- a/rcl/include/rcl/timer.h +++ b/rcl/include/rcl/timer.h @@ -318,6 +318,7 @@ rcl_timer_is_ready(const rcl_timer_t * timer, bool * is_ready); * \return #RCL_RET_OK if the timer until next call was successfully calculated, or * \return #RCL_RET_INVALID_ARGUMENT if any arguments are invalid, or * \return #RCL_RET_TIMER_INVALID if the timer is invalid, or + * \return #RCL_RET_TIMER_CANCELED if the timer is canceled, or * \return #RCL_RET_ERROR an unspecified error occur. */ RCL_PUBLIC diff --git a/rcl/src/rcl/timer.c b/rcl/src/rcl/timer.c index b672e5156..6c760be96 100644 --- a/rcl/src/rcl/timer.c +++ b/rcl/src/rcl/timer.c @@ -297,10 +297,13 @@ rcl_timer_is_ready(const rcl_timer_t * timer, bool * is_ready) RCL_CHECK_ARGUMENT_FOR_NULL(is_ready, RCL_RET_INVALID_ARGUMENT); int64_t time_until_next_call; rcl_ret_t ret = rcl_timer_get_time_until_next_call(timer, &time_until_next_call); - if (ret != RCL_RET_OK) { + if (ret == RCL_RET_TIMER_CANCELED) { + *is_ready = false; + return RCL_RET_OK; + } else if (ret != RCL_RET_OK) { return ret; // rcl error state should already be set. } - *is_ready = (time_until_next_call <= 0) && !rcutils_atomic_load_bool(&timer->impl->canceled); + *is_ready = (time_until_next_call <= 0); return RCL_RET_OK; } @@ -309,6 +312,9 @@ rcl_timer_get_time_until_next_call(const rcl_timer_t * timer, int64_t * time_unt { RCL_CHECK_ARGUMENT_FOR_NULL(timer, RCL_RET_INVALID_ARGUMENT); RCL_CHECK_ARGUMENT_FOR_NULL(time_until_next_call, RCL_RET_INVALID_ARGUMENT); + if (rcutils_atomic_load_bool(&timer->impl->canceled)) { + return RCL_RET_TIMER_CANCELED; + } rcl_time_point_value_t now; rcl_ret_t ret = rcl_clock_get_now(timer->impl->clock, &now); if (ret != RCL_RET_OK) { diff --git a/rcl/test/rcl/test_timer.cpp b/rcl/test/rcl/test_timer.cpp index 8d0757875..66ed38c1c 100644 --- a/rcl/test/rcl/test_timer.cpp +++ b/rcl/test/rcl/test_timer.cpp @@ -497,6 +497,10 @@ TEST_F(TestTimerFixture, test_canceled_timer) { ret = rcl_timer_cancel(&timer); ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + int64_t time_until_next_call = 0; + ret = rcl_timer_get_time_until_next_call(&timer, &time_until_next_call); + EXPECT_EQ(RCL_RET_TIMER_CANCELED, ret) << rcl_get_error_string().str; + rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set(); ret = rcl_wait_set_init(&wait_set, 0, 0, 1, 0, 0, 0, context_ptr, rcl_get_default_allocator()); EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;