Skip to content

Commit 0248ebe

Browse files
fujitatomoyapeterpena
authored andcommitted
Ability to configure domain_id via InitOptions. (#1165)
Signed-off-by: Tomoya.Fujita <[email protected]> Signed-off-by: Pedro Pena <[email protected]>
1 parent 0e7fed9 commit 0248ebe

File tree

4 files changed

+128
-1
lines changed

4 files changed

+128
-1
lines changed

rclcpp/include/rclcpp/init_options.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define RCLCPP__INIT_OPTIONS_HPP_
1717

1818
#include <memory>
19+
#include <mutex>
1920

2021
#include "rcl/init_options.h"
2122
#include "rclcpp/visibility_control.hpp"
@@ -80,11 +81,30 @@ class InitOptions
8081
const rcl_init_options_t *
8182
get_rcl_init_options() const;
8283

84+
/// Retrieve default domain id and set.
85+
RCLCPP_PUBLIC
86+
void
87+
use_default_domain_id();
88+
89+
/// Set the domain id.
90+
RCLCPP_PUBLIC
91+
void
92+
set_domain_id(size_t domain_id);
93+
94+
/// Return domain id.
95+
RCLCPP_PUBLIC
96+
size_t
97+
get_domain_id() const;
98+
8399
protected:
84100
void
85101
finalize_init_options();
86102

87103
private:
104+
void
105+
finalize_init_options_impl();
106+
107+
mutable std::mutex init_options_mutex_;
88108
std::unique_ptr<rcl_init_options_t> init_options_;
89109
bool initialize_logging_{true};
90110
};

rclcpp/src/rclcpp/init_options.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ InitOptions &
6363
InitOptions::operator=(const InitOptions & other)
6464
{
6565
if (this != &other) {
66-
this->finalize_init_options();
66+
std::lock_guard<std::mutex> init_options_lock(init_options_mutex_);
67+
this->finalize_init_options_impl();
6768
rcl_ret_t ret = rcl_init_options_copy(other.get_rcl_init_options(), init_options_.get());
6869
if (RCL_RET_OK != ret) {
6970
rclcpp::exceptions::throw_from_rcl_error(ret, "failed to copy rcl init options");
@@ -80,6 +81,13 @@ InitOptions::~InitOptions()
8081

8182
void
8283
InitOptions::finalize_init_options()
84+
{
85+
std::lock_guard<std::mutex> init_options_lock(init_options_mutex_);
86+
this->finalize_init_options_impl();
87+
}
88+
89+
void
90+
InitOptions::finalize_init_options_impl()
8391
{
8492
if (init_options_) {
8593
rcl_ret_t ret = rcl_init_options_fini(init_options_.get());
@@ -99,4 +107,38 @@ InitOptions::get_rcl_init_options() const
99107
return init_options_.get();
100108
}
101109

110+
void
111+
InitOptions::use_default_domain_id()
112+
{
113+
size_t domain_id = RCL_DEFAULT_DOMAIN_ID;
114+
rcl_ret_t ret = rcl_get_default_domain_id(&domain_id);
115+
if (RCL_RET_OK != ret) {
116+
rclcpp::exceptions::throw_from_rcl_error(ret, "failed to get default domain id");
117+
}
118+
set_domain_id(domain_id);
119+
}
120+
121+
void
122+
InitOptions::set_domain_id(size_t domain_id)
123+
{
124+
std::lock_guard<std::mutex> init_options_lock(init_options_mutex_);
125+
rcl_ret_t ret = rcl_init_options_set_domain_id(init_options_.get(), domain_id);
126+
if (RCL_RET_OK != ret) {
127+
rclcpp::exceptions::throw_from_rcl_error(ret, "failed to set domain id to rcl init options");
128+
}
129+
}
130+
131+
size_t
132+
InitOptions::get_domain_id() const
133+
{
134+
std::lock_guard<std::mutex> init_options_lock(init_options_mutex_);
135+
size_t domain_id;
136+
rcl_ret_t ret = rcl_init_options_get_domain_id(init_options_.get(), &domain_id);
137+
if (RCL_RET_OK != ret) {
138+
rclcpp::exceptions::throw_from_rcl_error(ret, "failed to get domain id from rcl init options");
139+
}
140+
141+
return domain_id;
142+
}
143+
102144
} // namespace rclcpp

rclcpp/test/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,11 @@ if(TARGET test_node_options)
253253
ament_target_dependencies(test_node_options "rcl")
254254
target_link_libraries(test_node_options ${PROJECT_NAME})
255255
endif()
256+
ament_add_gtest(test_init_options rclcpp/test_init_options.cpp)
257+
if(TARGET test_init_options)
258+
ament_target_dependencies(test_init_options "rcl")
259+
target_link_libraries(test_init_options ${PROJECT_NAME})
260+
endif()
256261
ament_add_gtest(test_parameter_client rclcpp/test_parameter_client.cpp)
257262
if(TARGET test_parameter_client)
258263
ament_target_dependencies(test_parameter_client
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright 2020 Open Source Robotics Foundation, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <gtest/gtest.h>
16+
17+
#include <string>
18+
#include <vector>
19+
20+
#include "rcl/allocator.h"
21+
#include "rcl/domain_id.h"
22+
23+
#include "rclcpp/init_options.hpp"
24+
25+
26+
TEST(TestInitOptions, test_construction) {
27+
rcl_allocator_t allocator = rcl_get_default_allocator();
28+
auto options = rclcpp::InitOptions(allocator);
29+
const rcl_init_options_t * rcl_options = options.get_rcl_init_options();
30+
ASSERT_TRUE(rcl_options != nullptr);
31+
ASSERT_TRUE(rcl_options->impl != nullptr);
32+
33+
{
34+
auto options_copy = rclcpp::InitOptions(options);
35+
const rcl_init_options_t * rcl_options_copy = options_copy.get_rcl_init_options();
36+
ASSERT_TRUE(rcl_options_copy != nullptr);
37+
ASSERT_TRUE(rcl_options_copy->impl != nullptr);
38+
}
39+
40+
{
41+
auto options_copy = options;
42+
const rcl_init_options_t * rcl_options_copy = options_copy.get_rcl_init_options();
43+
ASSERT_TRUE(rcl_options_copy != nullptr);
44+
ASSERT_TRUE(rcl_options_copy->impl != nullptr);
45+
}
46+
}
47+
48+
TEST(TestInitOptions, test_domain_id) {
49+
rcl_allocator_t allocator = rcl_get_default_allocator();
50+
auto options = rclcpp::InitOptions(allocator);
51+
size_t domain_id = RCL_DEFAULT_DOMAIN_ID;
52+
EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id));
53+
54+
options.use_default_domain_id();
55+
EXPECT_EQ(domain_id, options.get_domain_id());
56+
options.set_domain_id(42);
57+
EXPECT_EQ((size_t)42, options.get_domain_id());
58+
options.use_default_domain_id();
59+
EXPECT_EQ(domain_id, options.get_domain_id());
60+
}

0 commit comments

Comments
 (0)