Skip to content

Commit 1b92da0

Browse files
authored
Update wait until data (#75)
* Update wait until data * Adjust pub sub test to only one call to rmw_wait * Update CI * Update approach * Revert "Update CI" This reverts commit 9f900dc.
1 parent b88b026 commit 1b92da0

2 files changed

Lines changed: 40 additions & 47 deletions

File tree

rmw_microxrcedds_c/src/rmw_wait.c

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,27 +64,23 @@ rmw_wait(
6464
timeout = (uint64_t)UXR_TIMEOUT_INF;
6565
}
6666

67-
// Look for the XRCE session
68-
uxrSession * session = NULL;
69-
70-
for (size_t i = 0; i < services->service_count && session == NULL; i++) {
71-
rmw_uxrce_service_t * custom_service = (rmw_uxrce_service_t *)services->services[i];
72-
session = &custom_service->owner_node->context->session;
73-
}
74-
75-
for (size_t i = 0; i < clients->client_count && session == NULL; i++) {
76-
rmw_uxrce_client_t * custom_client = (rmw_uxrce_client_t *)clients->clients[i];
77-
session = &custom_client->owner_node->context->session;
78-
}
79-
80-
for (size_t i = 0; i < subscriptions->subscriber_count && session == NULL; ++i) {
81-
rmw_uxrce_subscription_t * custom_subscription =
82-
(rmw_uxrce_subscription_t *)subscriptions->subscribers[i];
83-
session = &custom_subscription->owner_node->context->session;
67+
// Run every XRCE session
68+
69+
uint8_t available_contexts = 0;
70+
struct rmw_uxrce_mempool_item_t * item = NULL;
71+
72+
item = session_memory.allocateditems;
73+
while (item != NULL) {
74+
item = item->next;
75+
available_contexts++;
8476
}
8577

86-
if (session != NULL) {
87-
uxr_run_session_until_timeout(session, timeout);
78+
uint64_t per_session_timeout = (uint64_t)((float)timeout/(float)available_contexts);
79+
item = session_memory.allocateditems;
80+
while (item != NULL) {
81+
rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data;
82+
uxr_run_session_until_data(&custom_context->session, per_session_timeout);
83+
item = item->next;
8884
}
8985

9086
bool buffered_status = false;

rmw_microxrcedds_c/test/test_pubsub.cpp

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -118,48 +118,44 @@ TEST_F(TestPubSub, publish_and_receive) {
118118

119119
ASSERT_EQ(rmw_publish(pub, &ros_message, NULL), RMW_RET_OK);
120120

121-
void * aux_ptr;
122-
do {
123-
aux_ptr = sub->data;
124-
rmw_subscriptions_t subscriptions;
125-
subscriptions.subscribers = &aux_ptr;
126-
subscriptions.subscriber_count = 1;
121+
rmw_subscriptions_t subscriptions;
122+
subscriptions.subscribers = &sub->data;
123+
subscriptions.subscriber_count = 1;
127124

128-
rmw_guard_conditions_t guard_conditions;
129-
guard_conditions.guard_condition_count = 0;
125+
rmw_guard_conditions_t guard_conditions;
126+
guard_conditions.guard_condition_count = 0;
130127

131-
rmw_services_t services;
132-
services.service_count = 0;
128+
rmw_services_t services;
129+
services.service_count = 0;
133130

134-
rmw_clients_t clients;
135-
clients.client_count = 0;
131+
rmw_clients_t clients;
132+
clients.client_count = 0;
136133

137-
rmw_events_t * events = NULL;
138-
rmw_wait_set_t * wait_set = NULL;
139-
rmw_time_t wait_timeout;
134+
rmw_events_t * events = NULL;
135+
rmw_wait_set_t * wait_set = NULL;
136+
rmw_time_t wait_timeout;
140137

138+
wait_timeout.sec = 1;
141139

142-
wait_timeout.sec = 1;
140+
rmw_ret_t ret = rmw_wait(
141+
&subscriptions,
142+
&guard_conditions,
143+
&services,
144+
&clients,
145+
events,
146+
wait_set,
147+
&wait_timeout
148+
);
143149

144-
// TODO(pablogs9): Ensure here that the wait works the first time with the Micro XRCE-DDS run session until data message update
145-
rmw_ret_t ret = rmw_wait(
146-
&subscriptions,
147-
&guard_conditions,
148-
&services,
149-
&clients,
150-
events,
151-
wait_set,
152-
&wait_timeout
153-
);
154-
} while (aux_ptr == NULL);
150+
ASSERT_NE((void *)subscriptions.subscribers[0], (void *)NULL);
155151

156152
rosidl_runtime_c__String read_ros_message;
157153
char buff[100];
158154
read_ros_message.data = buff;
159155
read_ros_message.capacity = sizeof(buff);
160156
read_ros_message.size = 0;
161157

162-
bool taken;
158+
bool taken = false;
163159
ASSERT_EQ(
164160
rmw_take_with_info(
165161
sub,
@@ -168,6 +164,7 @@ TEST_F(TestPubSub, publish_and_receive) {
168164
NULL,
169165
NULL
170166
), RMW_RET_OK);
167+
171168
ASSERT_EQ(taken, true);
172169
ASSERT_EQ(strcmp(content, read_ros_message.data), 0);
173170
ASSERT_EQ(strcmp(ros_message.data, read_ros_message.data), 0);

0 commit comments

Comments
 (0)