diff --git a/rcl/src/rcl/wait.c b/rcl/src/rcl/wait.c index dc338e1..1df4dfb 100644 --- a/rcl/src/rcl/wait.c +++ b/rcl/src/rcl/wait.c @@ -595,28 +595,24 @@ rcl_wait(rcl_wait_set_t * wait_set, int64_t timeout) } // Set corresponding rcl subscription handles NULL. for (i = 0; i < wait_set->size_of_subscriptions; ++i) { - assert(i < wait_set->impl->rmw_subscriptions.subscriber_count); // Defensive. if (!wait_set->impl->rmw_subscriptions.subscribers[i]) { wait_set->subscriptions[i] = NULL; } } // Set corresponding rcl guard_condition handles NULL. for (i = 0; i < wait_set->size_of_guard_conditions; ++i) { - assert(i < wait_set->impl->rmw_guard_conditions.guard_condition_count); // Defensive. if (!wait_set->impl->rmw_guard_conditions.guard_conditions[i]) { wait_set->guard_conditions[i] = NULL; } } // Set corresponding rcl client handles NULL. for (i = 0; i < wait_set->size_of_clients; ++i) { - assert(i < wait_set->impl->rmw_clients.client_count); // Defensive. if (!wait_set->impl->rmw_clients.clients[i]) { wait_set->clients[i] = NULL; } } // Set corresponding rcl service handles NULL. for (i = 0; i < wait_set->size_of_services; ++i) { - assert(i < wait_set->impl->rmw_services.service_count); // Defensive. if (!wait_set->impl->rmw_services.services[i]) { wait_set->services[i] = NULL; } diff --git a/rcl/test/rcl/test_wait.cpp b/rcl/test/rcl/test_wait.cpp index 4dc8dee..5acab17 100644 --- a/rcl/test/rcl/test_wait.cpp +++ b/rcl/test/rcl/test_wait.cpp @@ -130,7 +130,6 @@ TEST(CLASSNAME(WaitSetTestFixture, RMW_IMPLEMENTATION), zero_timeout) { EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe(); }); - // Time spent during wait should be negligible. int64_t timeout = 0; std::chrono::steady_clock::time_point before_sc = std::chrono::steady_clock::now(); @@ -142,6 +141,17 @@ TEST(CLASSNAME(WaitSetTestFixture, RMW_IMPLEMENTATION), zero_timeout) { EXPECT_LE(diff, TOLERANCE); } +// Test rcl_wait_set_t with excess capacity works. +TEST(CLASSNAME(WaitSetTestFixture, RMW_IMPLEMENTATION), excess_capacity) { + rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set(); + rcl_ret_t ret = rcl_wait_set_init(&wait_set, 42, 42, 42, 42, 42, rcl_get_default_allocator()); + EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string_safe(); + + int64_t timeout = 1; + ret = rcl_wait(&wait_set, timeout); + ASSERT_EQ(RCL_RET_TIMEOUT, ret) << rcl_get_error_string_safe(); +} + // Check rcl_wait can be called in many threads, each with unique wait sets and resources. TEST(CLASSNAME(WaitSetTestFixture, RMW_IMPLEMENTATION), multi_wait_set_threaded) { rcl_ret_t ret;