From f379096b6a0c0c66622c242efd949f026cc81c22 Mon Sep 17 00:00:00 2001 From: acuadros95 Date: Tue, 25 Jul 2023 15:32:48 +0200 Subject: [PATCH 1/3] Run session if any session is present Signed-off-by: acuadros95 --- rmw_microxrcedds_c/src/rmw_wait.c | 43 +++---------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/rmw_microxrcedds_c/src/rmw_wait.c b/rmw_microxrcedds_c/src/rmw_wait.c index e70c9d17..297259b7 100644 --- a/rmw_microxrcedds_c/src/rmw_wait.c +++ b/rmw_microxrcedds_c/src/rmw_wait.c @@ -60,42 +60,15 @@ rmw_wait( rmw_uxrce_clean_expired_static_input_buffer(); - // Clear run flag for all sessions - rmw_uxrce_mempool_item_t * item = session_memory.allocateditems; - while (item != NULL) { - rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; - custom_context->need_to_be_ran = false; - item = item->next; - } - - // TODO(pablogs9): What happens if there already data in one entity? - // Enable flag for every XRCE session available in the entities - for (size_t i = 0; services && i < services->service_count; ++i) { - rmw_uxrce_service_t * custom_service = (rmw_uxrce_service_t *)services->services[i]; - custom_service->owner_node->context->need_to_be_ran = true; - } - - for (size_t i = 0; clients && i < clients->client_count; ++i) { - rmw_uxrce_client_t * custom_client = (rmw_uxrce_client_t *)clients->clients[i]; - custom_client->owner_node->context->need_to_be_ran = true; - } - - for (size_t i = 0; subscriptions && i < subscriptions->subscriber_count; ++i) { - rmw_uxrce_subscription_t * custom_subscription = - (rmw_uxrce_subscription_t *)subscriptions->subscribers[i]; - custom_subscription->owner_node->context->need_to_be_ran = true; - } - // Count sessions to be ran uint8_t available_contexts = 0; item = session_memory.allocateditems; while (item != NULL) { - rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; - available_contexts += custom_context->need_to_be_ran ? 1 : 0; + available_contexts++; item = item->next; } - // There is no context that contais any of the wait set entities. Nothing to wait here. + // Spin all available contexts to atleast handle session metatraffic if (available_contexts != 0) { int32_t per_session_timeout = (timeout.i32 == UXR_TIMEOUT_INF) ? UXR_TIMEOUT_INF : @@ -104,17 +77,7 @@ rmw_wait( item = session_memory.allocateditems; while (item != NULL) { rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; - if (custom_context->need_to_be_ran) { - uxr_run_session_until_data(&custom_context->session, per_session_timeout); - } - item = item->next; - } - } else { - // Spin with no blocking to handle session metatraffic - item = session_memory.allocateditems; - while (item != NULL) { - rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; - uxr_run_session_timeout(&custom_context->session, 0); + uxr_run_session_until_data(&custom_context->session, per_session_timeout); item = item->next; } } From af903886f2170ab2af5e059d336a8e7d317c5ba5 Mon Sep 17 00:00:00 2001 From: acuadros95 Date: Tue, 25 Jul 2023 15:49:16 +0200 Subject: [PATCH 2/3] Fix var type Signed-off-by: acuadros95 --- rmw_microxrcedds_c/src/rmw_wait.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmw_microxrcedds_c/src/rmw_wait.c b/rmw_microxrcedds_c/src/rmw_wait.c index 297259b7..290125da 100644 --- a/rmw_microxrcedds_c/src/rmw_wait.c +++ b/rmw_microxrcedds_c/src/rmw_wait.c @@ -62,7 +62,7 @@ rmw_wait( // Count sessions to be ran uint8_t available_contexts = 0; - item = session_memory.allocateditems; + rmw_uxrce_mempool_item_t * item = session_memory.allocateditems; while (item != NULL) { available_contexts++; item = item->next; From 52f23f9a342ca35006325691a3d6cfe05ff8345f Mon Sep 17 00:00:00 2001 From: acuadros95 Date: Tue, 25 Jul 2023 16:28:05 +0200 Subject: [PATCH 3/3] Modify timeout approach Signed-off-by: acuadros95 --- rmw_microxrcedds_c/src/rmw_wait.c | 51 ++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/rmw_microxrcedds_c/src/rmw_wait.c b/rmw_microxrcedds_c/src/rmw_wait.c index 290125da..8e681d80 100644 --- a/rmw_microxrcedds_c/src/rmw_wait.c +++ b/rmw_microxrcedds_c/src/rmw_wait.c @@ -60,15 +60,44 @@ rmw_wait( rmw_uxrce_clean_expired_static_input_buffer(); + // Clear run flag for all sessions + rmw_uxrce_mempool_item_t * item = session_memory.allocateditems; + while (item != NULL) { + rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; + custom_context->need_to_be_ran = false; + item = item->next; + } + + // TODO(pablogs9): What happens if there already data in one entity? + // Enable flag for every XRCE session available in the entities + for (size_t i = 0; services && i < services->service_count; ++i) { + rmw_uxrce_service_t * custom_service = (rmw_uxrce_service_t *)services->services[i]; + custom_service->owner_node->context->need_to_be_ran = true; + } + + for (size_t i = 0; clients && i < clients->client_count; ++i) { + rmw_uxrce_client_t * custom_client = (rmw_uxrce_client_t *)clients->clients[i]; + custom_client->owner_node->context->need_to_be_ran = true; + } + + for (size_t i = 0; subscriptions && i < subscriptions->subscriber_count; ++i) { + rmw_uxrce_subscription_t * custom_subscription = + (rmw_uxrce_subscription_t *)subscriptions->subscribers[i]; + custom_subscription->owner_node->context->need_to_be_ran = true; + } + // Count sessions to be ran uint8_t available_contexts = 0; - rmw_uxrce_mempool_item_t * item = session_memory.allocateditems; + uint8_t available_sessions = 0; + item = session_memory.allocateditems; while (item != NULL) { - available_contexts++; + rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; + available_contexts += custom_context->need_to_be_ran ? 1 : 0; + available_sessions++; item = item->next; } - // Spin all available contexts to atleast handle session metatraffic + // There is no context that contais any of the wait set entities. Nothing to wait here. if (available_contexts != 0) { int32_t per_session_timeout = (timeout.i32 == UXR_TIMEOUT_INF) ? UXR_TIMEOUT_INF : @@ -77,7 +106,21 @@ rmw_wait( item = session_memory.allocateditems; while (item != NULL) { rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; - uxr_run_session_until_data(&custom_context->session, per_session_timeout); + if (custom_context->need_to_be_ran) { + uxr_run_session_until_data(&custom_context->session, per_session_timeout); + } + item = item->next; + } + } else if (available_sessions != 0) { + int32_t per_session_timeout = + (timeout.i32 == UXR_TIMEOUT_INF) ? UXR_TIMEOUT_INF : + (int32_t)((float)timeout.i32 / (float)available_sessions); + + // Spin with no blocking to handle session metatraffic + item = session_memory.allocateditems; + while (item != NULL) { + rmw_context_impl_t * custom_context = (rmw_context_impl_t *)item->data; + uxr_run_session_timeout(&custom_context->session, per_session_timeout); item = item->next; } }