From f92e52a2bb6956fb754256959d35fa5e809f7839 Mon Sep 17 00:00:00 2001 From: tomoya Date: Thu, 17 Oct 2019 22:30:08 +0900 Subject: [PATCH] Not creating rosout publisher instance unless required. (#514) Signed-off-by: Tomoya.Fujita --- rcl/include/rcl/logging.h | 19 +++++++++++++++++++ rcl/src/rcl/logging.c | 5 +++++ rcl/src/rcl/node.c | 24 +++++++++++++++--------- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/rcl/include/rcl/logging.h b/rcl/include/rcl/logging.h index c73f64211..9175c6f95 100644 --- a/rcl/include/rcl/logging.h +++ b/rcl/include/rcl/logging.h @@ -71,6 +71,25 @@ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_logging_fini(); +/// See if logging rosout is enabled. +/** + * This function is meant to be used to check if logging rosout is enabled. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | No + * Thread-Safe | Yes + * Uses Atomics | No + * Lock-Free | Yes + * + * \return `TRUE` if logging rosout is enabled, or + * \return `FALSE` if logging rosout is disabled. + */ +RCL_PUBLIC +RCL_WARN_UNUSED +bool rcl_logging_rosout_enabled(); + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/logging.c b/rcl/src/rcl/logging.c index ee93fc0a2..96c625dcd 100644 --- a/rcl/src/rcl/logging.c +++ b/rcl/src/rcl/logging.c @@ -119,6 +119,11 @@ rcl_ret_t rcl_logging_fini() return status; } +bool rcl_logging_rosout_enabled() +{ + return g_rcl_logging_rosout_enabled; +} + static void rcl_logging_multiple_output_handler( diff --git a/rcl/src/rcl/node.c b/rcl/src/rcl/node.c index d6ad72098..649ebcd06 100644 --- a/rcl/src/rcl/node.c +++ b/rcl/src/rcl/node.c @@ -26,6 +26,7 @@ extern "C" #include "rcl/arguments.h" #include "rcl/error_handling.h" +#include "rcl/logging.h" #include "rcl/logging_rosout.h" #include "rcl/rcl.h" #include "rcl/remap.h" @@ -355,17 +356,19 @@ rcl_node_init( } // The initialization for the rosout publisher requires the node to be in initialized to a point // that it can create new topic publishers - ret = rcl_logging_rosout_init_publisher_for_node(node); - if (ret != RCL_RET_OK) { - // error message already set - goto fail; + if (rcl_logging_rosout_enabled()) { + ret = rcl_logging_rosout_init_publisher_for_node(node); + if (ret != RCL_RET_OK) { + // error message already set + goto fail; + } } RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "Node initialized"); ret = RCL_RET_OK; goto cleanup; fail: if (node->impl) { - if (node->impl->logger_name) { + if (rcl_logging_rosout_enabled() && node->impl->logger_name) { ret = rcl_logging_rosout_fini_publisher_for_node(node); RCUTILS_LOG_ERROR_EXPRESSION_NAMED((ret != RCL_RET_OK && ret != RCL_RET_NOT_INIT), ROS_PACKAGE_NAME, "Failed to fini publisher for node: %i", ret); @@ -431,10 +434,13 @@ rcl_node_fini(rcl_node_t * node) } rcl_allocator_t allocator = node->impl->options.allocator; rcl_ret_t result = RCL_RET_OK; - rcl_ret_t rcl_ret = rcl_logging_rosout_fini_publisher_for_node(node); - if (rcl_ret != RCL_RET_OK && rcl_ret != RCL_RET_NOT_INIT) { - RCL_SET_ERROR_MSG("Unable to fini publisher for node."); - result = RCL_RET_ERROR; + rcl_ret_t rcl_ret = RCL_RET_OK; + if (rcl_logging_rosout_enabled()) { + rcl_ret = rcl_logging_rosout_fini_publisher_for_node(node); + if (rcl_ret != RCL_RET_OK && rcl_ret != RCL_RET_NOT_INIT) { + RCL_SET_ERROR_MSG("Unable to fini publisher for node."); + result = RCL_RET_ERROR; + } } rmw_ret_t rmw_ret = rmw_destroy_node(node->impl->rmw_node_handle); if (rmw_ret != RMW_RET_OK) {