Skip to content

Commit f35e200

Browse files
Fix guard conditions (#209) (#210)
* Fix guard conditions Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Add regression test Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Minor fixes Signed-off-by: Pablo Garrido <pablogs9@gmail.com> (cherry picked from commit 7bffd49) Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
1 parent 4d17bee commit f35e200

5 files changed

Lines changed: 100 additions & 20 deletions

File tree

rmw_microxrcedds_c/src/rmw_guard_condition.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ rmw_create_guard_condition(
3434
aux_guard_condition->rmw_guard_condition.context = context;
3535
aux_guard_condition->rmw_guard_condition.implementation_identifier =
3636
rmw_get_implementation_identifier();
37+
aux_guard_condition->rmw_guard_condition.data = aux_guard_condition;
3738

3839
return &aux_guard_condition->rmw_guard_condition;
3940
}

rmw_microxrcedds_c/src/rmw_trigger_guard_condition.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ rmw_trigger_guard_condition(
3030
RMW_SET_ERROR_MSG("guard condition handle not from this implementation");
3131
ret = RMW_RET_ERROR;
3232
} else {
33-
bool * hasTriggered = (bool *)guard_condition->data;
34-
*hasTriggered = true;
33+
rmw_uxrce_guard_condition_t * aux_guard_condition =
34+
(rmw_uxrce_guard_condition_t *)guard_condition->data;
35+
aux_guard_condition->hasTriggered = true;
3536
}
3637

3738
return ret;

rmw_microxrcedds_c/src/rmw_wait.c

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,19 @@ rmw_wait(
9696
}
9797

9898
// There is no context that contais any of the wait set entities. Nothing to wait here.
99-
if (available_contexts == 0) {
100-
UXR_UNLOCK(&rmw_uxrce_wait_mutex);
101-
return RMW_RET_OK;
102-
}
103-
104-
int32_t per_session_timeout =
105-
(timeout.i32 == UXR_TIMEOUT_INF) ? UXR_TIMEOUT_INF :
106-
(int32_t)((float)timeout.i32 / (float)available_contexts);
107-
108-
item = session_memory.allocateditems;
109-
while (item != NULL) {
110-
rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data;
111-
if (custom_context->need_to_be_ran) {
112-
uxr_run_session_until_data(&custom_context->session, per_session_timeout);
99+
if (available_contexts != 0) {
100+
int32_t per_session_timeout =
101+
(timeout.i32 == UXR_TIMEOUT_INF) ? UXR_TIMEOUT_INF :
102+
(int32_t)((float)timeout.i32 / (float)available_contexts);
103+
104+
item = session_memory.allocateditems;
105+
while (item != NULL) {
106+
rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data;
107+
if (custom_context->need_to_be_ran) {
108+
uxr_run_session_until_data(&custom_context->session, per_session_timeout);
109+
}
110+
item = item->next;
113111
}
114-
item = item->next;
115112
}
116113

117114
UXR_UNLOCK(&rmw_uxrce_wait_mutex);
@@ -154,11 +151,12 @@ rmw_wait(
154151

155152
// Check guard conditions
156153
for (size_t i = 0; guard_conditions && i < guard_conditions->guard_condition_count; ++i) {
157-
bool * hasTriggered = (bool *)guard_conditions->guard_conditions[i];
158-
if ((*hasTriggered) == false) {
154+
rmw_uxrce_guard_condition_t * custom_guard_condition =
155+
(rmw_uxrce_guard_condition_t *)guard_conditions->guard_conditions[i];
156+
if (custom_guard_condition->hasTriggered == false) {
159157
guard_conditions->guard_conditions[i] = NULL;
160158
} else {
161-
*hasTriggered = false;
159+
custom_guard_condition->hasTriggered = false;
162160
buffered_status = true;
163161
}
164162
}

rmw_microxrcedds_c/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,4 @@ rmw_test(test-reqres test_reqres.cpp)
5656
rmw_test(test-topic test_topic.cpp)
5757
rmw_test(test-rmw test_rmw.cpp)
5858
rmw_test(test-sizes test_sizes.cpp)
59+
rmw_test(test-guardcond test_guard_condition.cpp)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <memory>
16+
#include <string>
17+
#include <chrono>
18+
#include <thread>
19+
#include <vector>
20+
21+
#include "rmw/error_handling.h"
22+
#include "rmw/rmw.h"
23+
#include "rmw/validate_namespace.h"
24+
#include "rmw/validate_node_name.h"
25+
26+
#include "./rmw_base_test.hpp"
27+
#include "./test_utils.hpp"
28+
29+
#include "rosidl_runtime_c/string.h"
30+
31+
#define MICROXRCEDDS_PADDING sizeof(uint32_t)
32+
33+
class TestGuardCondition : public ::testing::Test
34+
{
35+
public:
36+
void SetUp() override
37+
{
38+
ASSERT_EQ(rmw_init_options_init(&options, rcutils_get_default_allocator()), RMW_RET_OK);
39+
ASSERT_EQ(rmw_init(&options, &context), RMW_RET_OK);
40+
}
41+
42+
void TearDown() override
43+
{
44+
ASSERT_EQ(rmw_init_options_fini(&options), RMW_RET_OK);
45+
ASSERT_EQ(rmw_shutdown(&context), RMW_RET_OK);
46+
}
47+
48+
protected:
49+
rmw_context_t context = rmw_get_zero_initialized_context();
50+
rmw_init_options_t options = rmw_get_zero_initialized_init_options();
51+
};
52+
53+
TEST_F(TestGuardCondition, guard_condition)
54+
{
55+
rmw_guard_condition_t * gc = rmw_create_guard_condition(&context);
56+
ASSERT_NE(gc, nullptr);
57+
58+
rmw_guard_conditions_t guard_conditions;
59+
void * aux[1] = {gc->data};
60+
guard_conditions.guard_conditions = aux;
61+
guard_conditions.guard_condition_count = 1;
62+
63+
rmw_time_t wait_timeout = (rmw_time_t) {1LL, 1LL};
64+
65+
rmw_ret_t rc = rmw_wait(NULL, &guard_conditions, NULL, NULL, NULL, NULL, &wait_timeout);
66+
ASSERT_EQ(rc, RMW_RET_TIMEOUT);
67+
68+
rc = rmw_trigger_guard_condition(gc);
69+
ASSERT_EQ(rc, RMW_RET_OK);
70+
71+
aux[0] = gc->data;
72+
guard_conditions.guard_conditions = aux;
73+
guard_conditions.guard_condition_count = 1;
74+
rc = rmw_wait(NULL, &guard_conditions, NULL, NULL, NULL, NULL, &wait_timeout);
75+
ASSERT_EQ(rc, RMW_RET_OK);
76+
77+
rc = rmw_destroy_guard_condition(gc);
78+
ASSERT_EQ(rc, RMW_RET_OK);
79+
}

0 commit comments

Comments
 (0)