freeing Time members in destructor, adding copy constructor / assignment operator (#362)
* copy constructor for fixing windows debug * remove debug prints * style * correctly free resources in destructor * correct copy and assignment operators * explicit call to copy constructor
This commit is contained in:
parent
6f3020ce23
commit
8e2e64e82a
3 changed files with 37 additions and 2 deletions
|
@ -38,6 +38,9 @@ public:
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
explicit Time(uint64_t nanoseconds, rcl_time_source_type_t clock = RCL_SYSTEM_TIME);
|
explicit Time(uint64_t nanoseconds, rcl_time_source_type_t clock = RCL_SYSTEM_TIME);
|
||||||
|
|
||||||
|
RCLCPP_PUBLIC
|
||||||
|
Time(const Time & rhs);
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
Time(const builtin_interfaces::msg::Time & time_msg); // NOLINT
|
Time(const builtin_interfaces::msg::Time & time_msg); // NOLINT
|
||||||
|
|
||||||
|
@ -47,6 +50,10 @@ public:
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
operator builtin_interfaces::msg::Time() const;
|
operator builtin_interfaces::msg::Time() const;
|
||||||
|
|
||||||
|
RCLCPP_PUBLIC
|
||||||
|
void
|
||||||
|
operator=(const Time & rhs);
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
void
|
void
|
||||||
operator=(const builtin_interfaces::msg::Time & time_msg);
|
operator=(const builtin_interfaces::msg::Time & time_msg);
|
||||||
|
|
|
@ -102,6 +102,13 @@ Time::Time(uint64_t nanoseconds, rcl_time_source_type_t clock)
|
||||||
rcl_time_.nanoseconds = nanoseconds;
|
rcl_time_.nanoseconds = nanoseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Time::Time(const Time & rhs)
|
||||||
|
: rcl_time_source_(init_time_source(rhs.rcl_time_source_.type)),
|
||||||
|
rcl_time_(init_time_point(rcl_time_source_))
|
||||||
|
{
|
||||||
|
rcl_time_.nanoseconds = rhs.rcl_time_.nanoseconds;
|
||||||
|
}
|
||||||
|
|
||||||
Time::Time(const builtin_interfaces::msg::Time & time_msg) // NOLINT
|
Time::Time(const builtin_interfaces::msg::Time & time_msg) // NOLINT
|
||||||
: rcl_time_source_(init_time_source(RCL_SYSTEM_TIME)),
|
: rcl_time_source_(init_time_source(RCL_SYSTEM_TIME)),
|
||||||
rcl_time_(init_time_point(rcl_time_source_))
|
rcl_time_(init_time_point(rcl_time_source_))
|
||||||
|
@ -116,6 +123,9 @@ Time::Time(const builtin_interfaces::msg::Time & time_msg) // NOLINT
|
||||||
|
|
||||||
Time::~Time()
|
Time::~Time()
|
||||||
{
|
{
|
||||||
|
if (rcl_time_source_fini(&rcl_time_source_) != RCL_RET_OK) {
|
||||||
|
RCUTILS_LOG_FATAL("failed to reclaim rcl_time_source_t in destructor of rclcpp::Time")
|
||||||
|
}
|
||||||
if (rcl_time_point_fini(&rcl_time_) != RCL_RET_OK) {
|
if (rcl_time_point_fini(&rcl_time_) != RCL_RET_OK) {
|
||||||
RCUTILS_LOG_FATAL("failed to reclaim rcl_time_point_t in destructor of rclcpp::Time")
|
RCUTILS_LOG_FATAL("failed to reclaim rcl_time_point_t in destructor of rclcpp::Time")
|
||||||
}
|
}
|
||||||
|
@ -129,6 +139,14 @@ Time::operator builtin_interfaces::msg::Time() const
|
||||||
return msg_time;
|
return msg_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Time::operator=(const Time & rhs)
|
||||||
|
{
|
||||||
|
rcl_time_source_ = init_time_source(rhs.rcl_time_source_.type);
|
||||||
|
rcl_time_ = init_time_point(rcl_time_source_);
|
||||||
|
rcl_time_.nanoseconds = rhs.rcl_time_.nanoseconds;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Time::operator=(const builtin_interfaces::msg::Time & time_msg)
|
Time::operator=(const builtin_interfaces::msg::Time & time_msg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -102,8 +102,8 @@ TEST(TestTime, operators) {
|
||||||
EXPECT_EQ(sub.nanoseconds(), young.nanoseconds() - old.nanoseconds());
|
EXPECT_EQ(sub.nanoseconds(), young.nanoseconds() - old.nanoseconds());
|
||||||
EXPECT_EQ(sub, young - old);
|
EXPECT_EQ(sub, young - old);
|
||||||
|
|
||||||
rclcpp::Time system_time(1, 0, RCL_SYSTEM_TIME);
|
rclcpp::Time system_time(0, 0, RCL_SYSTEM_TIME);
|
||||||
rclcpp::Time steady_time(2, 0, RCL_STEADY_TIME);
|
rclcpp::Time steady_time(0, 0, RCL_STEADY_TIME);
|
||||||
|
|
||||||
EXPECT_ANY_THROW((void)(system_time == steady_time));
|
EXPECT_ANY_THROW((void)(system_time == steady_time));
|
||||||
EXPECT_ANY_THROW((void)(system_time <= steady_time));
|
EXPECT_ANY_THROW((void)(system_time <= steady_time));
|
||||||
|
@ -123,6 +123,16 @@ TEST(TestTime, operators) {
|
||||||
EXPECT_ANY_THROW((void)(now > later));
|
EXPECT_ANY_THROW((void)(now > later));
|
||||||
EXPECT_ANY_THROW((void)(now + later));
|
EXPECT_ANY_THROW((void)(now + later));
|
||||||
EXPECT_ANY_THROW((void)(now - later));
|
EXPECT_ANY_THROW((void)(now - later));
|
||||||
|
|
||||||
|
for (auto time_source : {RCL_ROS_TIME, RCL_SYSTEM_TIME, RCL_STEADY_TIME}) {
|
||||||
|
rclcpp::Time time = rclcpp::Time(0, 0, time_source);
|
||||||
|
rclcpp::Time copy_constructor_time(time);
|
||||||
|
rclcpp::Time assignment_op_time = rclcpp::Time(1, 0, time_source);
|
||||||
|
assignment_op_time = time;
|
||||||
|
|
||||||
|
EXPECT_TRUE(time == copy_constructor_time);
|
||||||
|
EXPECT_TRUE(time == assignment_op_time);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(TestTime, overflows) {
|
TEST(TestTime, overflows) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue