Capturing a cached reference allows a clock object that is not a local (e.g. the one returned by Node::get_clock()) to be passed to the throttle logging macro. Signed-off-by: Matt Schickler <mschickler@gmail.com> Co-Authored-By: Ivan Santiago Paunovic <ivanpauno@ekumenlabs.com>
This commit is contained in:
parent
fdaf96f217
commit
3ec882cd2d
2 changed files with 40 additions and 3 deletions
|
@ -129,9 +129,9 @@ def get_rclcpp_suffix_from_features(features):
|
||||||
typename ::rclcpp::Logger>::value, \
|
typename ::rclcpp::Logger>::value, \
|
||||||
"First argument to logging macros must be an rclcpp::Logger"); \
|
"First argument to logging macros must be an rclcpp::Logger"); \
|
||||||
@[ if 'throttle' in feature_combination]@ \
|
@[ if 'throttle' in feature_combination]@ \
|
||||||
auto get_time_point = [&clock](rcutils_time_point_value_t * time_point) -> rcutils_ret_t { \
|
auto get_time_point = [&c=clock](rcutils_time_point_value_t * time_point) -> rcutils_ret_t { \
|
||||||
try { \
|
try { \
|
||||||
*time_point = clock.now().nanoseconds(); \
|
*time_point = c.now().nanoseconds(); \
|
||||||
} catch (...) { \
|
} catch (...) { \
|
||||||
RCUTILS_SAFE_FWRITE_TO_STDERR( \
|
RCUTILS_SAFE_FWRITE_TO_STDERR( \
|
||||||
"[rclcpp|logging.hpp] RCLCPP_@(severity)@(suffix) could not get current time stamp\n"); \
|
"[rclcpp|logging.hpp] RCLCPP_@(severity)@(suffix) could not get current time stamp\n"); \
|
||||||
|
|
|
@ -77,16 +77,33 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DummyNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DummyNode()
|
||||||
|
{
|
||||||
|
clock_ = rclcpp::Clock::make_shared(RCL_ROS_TIME);
|
||||||
|
}
|
||||||
|
rclcpp::Clock::SharedPtr get_clock()
|
||||||
|
{
|
||||||
|
return clock_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
rclcpp::Clock::SharedPtr clock_;
|
||||||
|
};
|
||||||
|
|
||||||
TEST_F(TestLoggingMacros, test_logging_named) {
|
TEST_F(TestLoggingMacros, test_logging_named) {
|
||||||
for (int i : {1, 2, 3}) {
|
for (int i : {1, 2, 3}) {
|
||||||
RCLCPP_DEBUG(g_logger, "message %d", i);
|
RCLCPP_DEBUG(g_logger, "message %d", i);
|
||||||
}
|
}
|
||||||
|
size_t expected_location = __LINE__ - 2u;
|
||||||
EXPECT_EQ(3u, g_log_calls);
|
EXPECT_EQ(3u, g_log_calls);
|
||||||
EXPECT_TRUE(g_last_log_event.location != NULL);
|
EXPECT_TRUE(g_last_log_event.location != NULL);
|
||||||
if (g_last_log_event.location) {
|
if (g_last_log_event.location) {
|
||||||
EXPECT_STREQ("TestBody", g_last_log_event.location->function_name);
|
EXPECT_STREQ("TestBody", g_last_log_event.location->function_name);
|
||||||
EXPECT_THAT(g_last_log_event.location->file_name, EndsWith("test_logging.cpp"));
|
EXPECT_THAT(g_last_log_event.location->file_name, EndsWith("test_logging.cpp"));
|
||||||
EXPECT_EQ(82u, g_last_log_event.location->line_number);
|
EXPECT_EQ(expected_location, g_last_log_event.location->line_number);
|
||||||
}
|
}
|
||||||
EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, g_last_log_event.level);
|
EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, g_last_log_event.level);
|
||||||
EXPECT_EQ("name", g_last_log_event.name);
|
EXPECT_EQ("name", g_last_log_event.name);
|
||||||
|
@ -210,6 +227,26 @@ TEST_F(TestLoggingMacros, test_throttle) {
|
||||||
EXPECT_EQ(6u, g_log_calls);
|
EXPECT_EQ(6u, g_log_calls);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DummyNode node;
|
||||||
|
rcl_clock_t * node_clock = node.get_clock()->get_clock_handle();
|
||||||
|
ASSERT_TRUE(node_clock);
|
||||||
|
ASSERT_EQ(RCL_RET_OK, rcl_enable_ros_time_override(node_clock));
|
||||||
|
EXPECT_EQ(6u, g_log_calls);
|
||||||
|
EXPECT_EQ(RCL_RET_OK, rcl_set_ros_time_override(node_clock, RCUTILS_MS_TO_NS(10)));
|
||||||
|
for (uint64_t i = 0; i < 3; ++i) {
|
||||||
|
RCLCPP_DEBUG_THROTTLE(g_logger, *node.get_clock(), 10, "Throttling");
|
||||||
|
if (i == 0) {
|
||||||
|
EXPECT_EQ(7u, g_log_calls);
|
||||||
|
rcl_time_point_value_t clock_ns = node.get_clock()->now().nanoseconds() + RCUTILS_MS_TO_NS(5);
|
||||||
|
EXPECT_EQ(RCL_RET_OK, rcl_set_ros_time_override(node_clock, clock_ns));
|
||||||
|
} else if (i == 1) {
|
||||||
|
EXPECT_EQ(7u, g_log_calls);
|
||||||
|
rcl_time_point_value_t clock_ns = node.get_clock()->now().nanoseconds() + RCUTILS_MS_TO_NS(5);
|
||||||
|
EXPECT_EQ(RCL_RET_OK, rcl_set_ros_time_override(node_clock, clock_ns));
|
||||||
|
} else {
|
||||||
|
EXPECT_EQ(8u, g_log_calls);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool log_function(rclcpp::Logger logger)
|
bool log_function(rclcpp::Logger logger)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue