Skip to content

Commit df55c29

Browse files
Create/Destroy timeouts API (#166) (#175)
* Create/Destroy timeouts API * Uncrustify * Update rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c Co-authored-by: Antonio Cuadros <49162117+Acuadros95@users.noreply.github.com> * Uncrustify Co-authored-by: Antonio Cuadros <49162117+Acuadros95@users.noreply.github.com> Co-authored-by: Antonio cuadros <acuadros1995@gmail.com> (cherry picked from commit cbbdf55) Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
1 parent a067628 commit df55c29

12 files changed

Lines changed: 128 additions & 34 deletions

File tree

rmw_microxrcedds_c/include/rmw_microros/timing.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,30 @@ rmw_ret_t rmw_uros_set_client_session_timeout(
7070
rmw_client_t * client,
7171
int session_timeout);
7272

73+
/**
74+
* \brief Sets the DDS-XRCE session spin time for creating entities
75+
*
76+
* \param[in] context RWM context where the spin time is configured
77+
* \param[in] session_timeout time in milliseconds
78+
* \return RMW_RET_OK when success.
79+
* \return RMW_RET_INVALID_ARGUMENT If client is not valid or unexpected arguments.
80+
*/
81+
rmw_ret_t rmw_uros_set_context_entity_creation_session_timeout(
82+
rmw_context_t * context,
83+
int session_timeout);
84+
85+
/**
86+
* \brief Sets the DDS-XRCE session spin time for destroying entities
87+
*
88+
* \param[in] context RWM context where the spin time is configured
89+
* \param[in] session_timeout time in milliseconds
90+
* \return RMW_RET_OK when success.
91+
* \return RMW_RET_INVALID_ARGUMENT If client is not valid or unexpected arguments.
92+
*/
93+
rmw_ret_t rmw_uros_set_context_entity_destroy_session_timeout(
94+
rmw_context_t * context,
95+
int session_timeout);
96+
7397
/** @}*/
7498

7599
#if defined(__cplusplus)

rmw_microxrcedds_c/src/rmw_client.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ rmw_create_client(
148148

149149
rmw_client->data = custom_client;
150150

151-
if (!run_xrce_session(custom_node->context, client_req)) {
151+
if (!run_xrce_session(
152+
custom_node->context, client_req,
153+
custom_node->context->creation_timeout))
154+
{
152155
put_memory(&client_memory, &custom_client->mem);
153156
goto fail;
154157
}
@@ -215,7 +218,10 @@ rmw_destroy_client(
215218
*custom_node->context->creation_destroy_stream,
216219
custom_client->client_id);
217220

218-
if (!run_xrce_session(custom_node->context, delete_client)) {
221+
if (!run_xrce_session(
222+
custom_node->context, delete_client,
223+
custom_node->context->destroy_timeout))
224+
{
219225
result_ret = RMW_RET_TIMEOUT;
220226
}
221227
rmw_uxrce_fini_client_memory(client);

rmw_microxrcedds_c/src/rmw_init.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ rmw_init(
188188
options->impl->transport_params.read_cb);
189189
#endif // RMW_UXRCE_TRANSPORT_CUSTOM
190190

191+
context_impl->creation_timeout = RMW_UXRCE_ENTITY_CREATION_DESTROY_TIMEOUT;
192+
context_impl->destroy_timeout = RMW_UXRCE_ENTITY_CREATION_DESTROY_TIMEOUT;
193+
191194
context_impl->id_participant = 0;
192195
context_impl->id_topic = 0;
193196
context_impl->id_publisher = 0;

rmw_microxrcedds_c/src/rmw_microros/timing.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,25 @@ rmw_ret_t rmw_uros_set_client_session_timeout(
5252
custom_client->session_timeout = session_timeout;
5353
return RMW_RET_OK;
5454
}
55+
56+
rmw_ret_t rmw_uros_set_context_entity_creation_session_timeout(
57+
rmw_context_t * context,
58+
int session_timeout)
59+
{
60+
RMW_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT);
61+
rmw_uxrce_session_t * custom_session = (rmw_uxrce_session_t *)context->impl;
62+
63+
custom_session->creation_timeout = session_timeout;
64+
return RMW_RET_OK;
65+
}
66+
67+
rmw_ret_t rmw_uros_set_context_entity_destroy_session_timeout(
68+
rmw_context_t * context,
69+
int session_timeout)
70+
{
71+
RMW_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT);
72+
rmw_uxrce_session_t * custom_session = (rmw_uxrce_session_t *)context->impl;
73+
74+
custom_session->destroy_timeout = session_timeout;
75+
return RMW_RET_OK;
76+
}

rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ create_topic(
8585
UXR_REPLACE | UXR_REUSE);
8686
#endif /* ifdef RMW_UXRCE_USE_XML */
8787

88-
if (!run_xrce_session(custom_node->context, topic_req)) {
88+
if (!run_xrce_session(
89+
custom_node->context, topic_req,
90+
custom_node->context->creation_timeout))
91+
{
8992
rmw_uxrce_fini_topic_memory(custom_topic);
9093
custom_topic = NULL;
9194
goto fail;
@@ -107,7 +110,10 @@ rmw_ret_t destroy_topic(
107110
*custom_node->context->creation_destroy_stream,
108111
topic->topic_id);
109112

110-
if (!run_xrce_session(custom_node->context, delete_topic)) {
113+
if (!run_xrce_session(
114+
custom_node->context, delete_topic,
115+
custom_node->context->destroy_timeout))
116+
{
111117
result_ret = RMW_RET_TIMEOUT;
112118
}
113119
rmw_uxrce_fini_topic_memory(topic);

rmw_microxrcedds_c/src/rmw_node.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,20 @@ rmw_node_t * create_node(
4242
goto fail;
4343
}
4444

45-
rmw_uxrce_node_t * node_info = (rmw_uxrce_node_t *)memory_node->data;
45+
rmw_uxrce_node_t * custom_node = (rmw_uxrce_node_t *)memory_node->data;
4646

47-
node_info->context = context->impl;
47+
custom_node->context = context->impl;
4848

4949
node_handle = rmw_node_allocate();
5050
if (!node_handle) {
5151
RMW_SET_ERROR_MSG("failed to allocate rmw_node_t");
5252
return NULL;
5353
}
5454

55-
node_info->rmw_handle = node_handle;
55+
custom_node->rmw_handle = node_handle;
5656

5757
node_handle->implementation_identifier = rmw_get_implementation_identifier();
58-
node_handle->data = node_info;
58+
node_handle->data = custom_node;
5959
node_handle->name = (const char *)(rmw_allocate(sizeof(char) * (strlen(name) + 1)));
6060
if (!node_handle->name) {
6161
RMW_SET_ERROR_MSG("failed to allocate memory");
@@ -72,8 +72,8 @@ rmw_node_t * create_node(
7272
}
7373
memcpy((char *)node_handle->namespace_, namespace_, strlen(namespace_) + 1);
7474

75-
node_info->participant_id =
76-
uxr_object_id(node_info->context->id_participant++, UXR_PARTICIPANT_ID);
75+
custom_node->participant_id =
76+
uxr_object_id(custom_node->context->id_participant++, UXR_PARTICIPANT_ID);
7777
uint16_t participant_req = UXR_INVALID_REQUEST_ID;
7878

7979
#ifdef RMW_UXRCE_USE_REFS
@@ -85,9 +85,9 @@ rmw_node_t * create_node(
8585
return NULL;
8686
}
8787
participant_req = uxr_buffer_create_participant_ref(
88-
&node_info->context->session,
89-
*node_info->context->creation_destroy_stream,
90-
node_info->participant_id,
88+
&custom_node->context->session,
89+
*custom_node->context->creation_destroy_stream,
90+
custom_node->participant_id,
9191
(uint16_t)domain_id,
9292
rmw_uxrce_entity_naming_buffer, UXR_REPLACE | UXR_REUSE);
9393
#else
@@ -100,15 +100,18 @@ rmw_node_t * create_node(
100100
}
101101

102102
participant_req = uxr_buffer_create_participant_bin(
103-
&node_info->context->session,
104-
*node_info->context->creation_destroy_stream,
105-
node_info->participant_id,
103+
&custom_node->context->session,
104+
*custom_node->context->creation_destroy_stream,
105+
custom_node->participant_id,
106106
domain_id,
107107
xrce_node_name,
108108
UXR_REPLACE | UXR_REUSE);
109109
#endif /* ifdef RMW_UXRCE_USE_REFS */
110110

111-
if (!run_xrce_session(node_info->context, participant_req)) {
111+
if (!run_xrce_session(
112+
custom_node->context, participant_req,
113+
custom_node->context->creation_timeout))
114+
{
112115
rmw_uxrce_fini_node_memory(node_handle);
113116
return NULL;
114117
}
@@ -209,7 +212,10 @@ rmw_ret_t rmw_destroy_node(
209212
*custom_node->context->creation_destroy_stream,
210213
custom_node->participant_id);
211214

212-
if (!run_xrce_session(custom_node->context, delete_participant)) {
215+
if (!run_xrce_session(
216+
custom_node->context, delete_participant,
217+
custom_node->context->destroy_timeout))
218+
{
213219
ret = RMW_RET_TIMEOUT;
214220
}
215221

rmw_microxrcedds_c/src/rmw_publisher.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ rmw_create_publisher(
168168
UXR_REPLACE | UXR_REUSE);
169169
#endif /* ifdef RMW_UXRCE_USE_REFS */
170170

171-
if (!run_xrce_session(custom_node->context, publisher_req)) {
171+
if (!run_xrce_session(
172+
custom_node->context, publisher_req,
173+
custom_node->context->creation_timeout))
174+
{
172175
put_memory(&publisher_memory, &custom_publisher->mem);
173176
goto fail;
174177
}
@@ -225,7 +228,10 @@ rmw_create_publisher(
225228
UXR_REPLACE | UXR_REUSE);
226229
#endif /* ifdef RMW_UXRCE_USE_REFS */
227230

228-
if (!run_xrce_session(custom_node->context, datawriter_req)) {
231+
if (!run_xrce_session(
232+
custom_node->context, datawriter_req,
233+
custom_node->context->creation_timeout))
234+
{
229235
put_memory(&publisher_memory, &custom_publisher->mem);
230236
goto fail;
231237
}
@@ -368,8 +374,12 @@ rmw_destroy_publisher(
368374
*custom_publisher->owner_node->context->creation_destroy_stream,
369375
custom_publisher->publisher_id);
370376

371-
bool ret = run_xrce_session(custom_node->context, delete_writer);
372-
ret &= run_xrce_session(custom_node->context, delete_publisher);
377+
bool ret = run_xrce_session(
378+
custom_node->context, delete_writer,
379+
custom_node->context->destroy_timeout);
380+
ret &= run_xrce_session(
381+
custom_node->context, delete_publisher,
382+
custom_node->context->destroy_timeout);
373383
if (!ret) {
374384
result_ret = RMW_RET_TIMEOUT;
375385
}

rmw_microxrcedds_c/src/rmw_service.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ rmw_create_service(
145145

146146
rmw_service->data = custom_service;
147147

148-
if (!run_xrce_session(custom_node->context, service_req)) {
148+
if (!run_xrce_session(
149+
custom_node->context, service_req,
150+
custom_node->context->creation_timeout))
151+
{
149152
RMW_SET_ERROR_MSG("Issues creating Micro XRCE-DDS entities");
150153
put_memory(&service_memory, &custom_service->mem);
151154
goto fail;
@@ -213,7 +216,10 @@ rmw_destroy_service(
213216
*custom_node->context->creation_destroy_stream,
214217
custom_service->service_id);
215218

216-
if (!run_xrce_session(custom_node->context, delete_service)) {
219+
if (!run_xrce_session(
220+
custom_node->context, delete_service,
221+
custom_node->context->destroy_timeout))
222+
{
217223
result_ret = RMW_RET_TIMEOUT;
218224
}
219225
rmw_uxrce_fini_service_memory(service);

rmw_microxrcedds_c/src/rmw_subscription.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,10 @@ rmw_create_subscription(
157157
UXR_REPLACE | UXR_REUSE);
158158
#endif /* ifdef RMW_UXRCE_USE_REFS */
159159

160-
if (!run_xrce_session(custom_node->context, subscriber_req)) {
160+
if (!run_xrce_session(
161+
custom_node->context, subscriber_req,
162+
custom_node->context->creation_timeout))
163+
{
161164
put_memory(&subscription_memory, &custom_subscription->mem);
162165
goto fail;
163166
}
@@ -211,7 +214,10 @@ rmw_create_subscription(
211214
UXR_REPLACE | UXR_REUSE);
212215
#endif /* ifdef RMW_UXRCE_USE_XML */
213216

214-
if (!run_xrce_session(custom_node->context, datareader_req)) {
217+
if (!run_xrce_session(
218+
custom_node->context, datareader_req,
219+
custom_node->context->creation_timeout))
220+
{
215221
RMW_SET_ERROR_MSG("Issues creating Micro XRCE-DDS entities");
216222
put_memory(&subscription_memory, &custom_subscription->mem);
217223
goto fail;
@@ -340,8 +346,12 @@ rmw_destroy_subscription(
340346
*custom_subscription->owner_node->context->creation_destroy_stream,
341347
custom_subscription->subscriber_id);
342348

343-
bool ret = run_xrce_session(custom_node->context, delete_datareader);
344-
ret &= run_xrce_session(custom_node->context, delete_subscriber);
349+
bool ret = run_xrce_session(
350+
custom_node->context, delete_datareader,
351+
custom_node->context->destroy_timeout);
352+
ret &= run_xrce_session(
353+
custom_node->context, delete_subscriber,
354+
custom_node->context->destroy_timeout);
345355
if (!ret) {
346356
result_ret = RMW_RET_TIMEOUT;
347357
}

rmw_microxrcedds_c/src/types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ typedef struct rmw_context_impl_t
8282
uxrStreamId best_effort_input;
8383

8484
uxrStreamId * creation_destroy_stream;
85+
int creation_timeout;
86+
int destroy_timeout;
8587

8688
uint8_t input_reliable_stream_buffer[RMW_UXRCE_MAX_INPUT_BUFFER_SIZE];
8789
uint8_t output_reliable_stream_buffer[RMW_UXRCE_MAX_OUTPUT_BUFFER_SIZE];

0 commit comments

Comments
 (0)