Skip to content

Commit 9dd48ce

Browse files
committed
Change interrupt guard condition to shared_ptr
Check if guard condition is valid before adding it to the waitable Signed-off-by: Michael Carroll <[email protected]>
1 parent a6c4c1b commit 9dd48ce

File tree

6 files changed

+23
-25
lines changed

6 files changed

+23
-25
lines changed

rclcpp/include/rclcpp/executor.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,8 +637,9 @@ class Executor
637637
std::atomic_bool spinning;
638638

639639
/// Guard condition for signaling the rmw layer to wake up for special events.
640-
rclcpp::GuardCondition interrupt_guard_condition_;
640+
std::shared_ptr<rclcpp::GuardCondition> interrupt_guard_condition_;
641641

642+
/// Guard condition for signaling the rmw layer to wake up for system shutdown.
642643
std::shared_ptr<rclcpp::GuardCondition> shutdown_guard_condition_;
643644

644645
/// Wait set for managing entities that the rmw layer waits on.

rclcpp/src/rclcpp/callback_group.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ CallbackGroup::~CallbackGroup()
4343
{
4444
trigger_notify_guard_condition();
4545
}
46-
4746
bool
47+
4848
CallbackGroup::has_valid_node()
4949
{
5050
return nullptr != this->get_context_();

rclcpp/src/rclcpp/executor.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,11 @@
3838
using namespace std::chrono_literals;
3939

4040
using rclcpp::exceptions::throw_from_rcl_error;
41-
using rclcpp::AnyExecutable;
4241
using rclcpp::Executor;
43-
using rclcpp::ExecutorOptions;
44-
using rclcpp::FutureReturnCode;
4542

4643
Executor::Executor(const rclcpp::ExecutorOptions & options)
4744
: spinning(false),
48-
interrupt_guard_condition_(options.context),
45+
interrupt_guard_condition_(std::make_shared<rclcpp::GuardCondition>(options.context)),
4946
shutdown_guard_condition_(std::make_shared<rclcpp::GuardCondition>(options.context)),
5047
memory_strategy_(options.memory_strategy)
5148
{
@@ -65,7 +62,7 @@ Executor::Executor(const rclcpp::ExecutorOptions & options)
6562
memory_strategy_->add_guard_condition(*shutdown_guard_condition_.get());
6663

6764
// Put the executor's guard condition in
68-
memory_strategy_->add_guard_condition(interrupt_guard_condition_);
65+
memory_strategy_->add_guard_condition(*interrupt_guard_condition_.get());
6966
rcl_allocator_t allocator = memory_strategy_->get_allocator();
7067

7168
rcl_ret_t ret = rcl_wait_set_init(
@@ -127,7 +124,7 @@ Executor::~Executor()
127124
}
128125
// Remove and release the sigint guard condition
129126
memory_strategy_->remove_guard_condition(shutdown_guard_condition_.get());
130-
memory_strategy_->remove_guard_condition(&interrupt_guard_condition_);
127+
memory_strategy_->remove_guard_condition(interrupt_guard_condition_.get());
131128

132129
// Remove shutdown callback handle registered to Context
133130
if (!context_->remove_on_shutdown_callback(shutdown_callback_handle_)) {
@@ -231,7 +228,7 @@ Executor::add_callback_group_to_map(
231228
if (notify) {
232229
// Interrupt waiting to handle new node
233230
try {
234-
interrupt_guard_condition_.trigger();
231+
interrupt_guard_condition_->trigger();
235232
} catch (const rclcpp::exceptions::RCLError & ex) {
236233
throw std::runtime_error(
237234
std::string(
@@ -279,10 +276,10 @@ Executor::add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_pt
279276
}
280277
});
281278

282-
const auto & gc = node_ptr->get_notify_guard_condition();
283-
weak_nodes_to_guard_conditions_[node_ptr] = &gc;
279+
const auto gc = node_ptr->get_notify_guard_condition();
280+
weak_nodes_to_guard_conditions_[node_ptr] = gc.get();
284281
// Add the node's notify condition to the guard condition handles
285-
memory_strategy_->add_guard_condition(gc);
282+
memory_strategy_->add_guard_condition(*gc);
286283
weak_nodes_.push_back(node_ptr);
287284
}
288285

@@ -319,7 +316,7 @@ Executor::remove_callback_group_from_map(
319316

320317
if (notify) {
321318
try {
322-
interrupt_guard_condition_.trigger();
319+
interrupt_guard_condition_->trigger();
323320
} catch (const rclcpp::exceptions::RCLError & ex) {
324321
throw std::runtime_error(
325322
std::string(
@@ -387,7 +384,7 @@ Executor::remove_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node
387384
}
388385
}
389386

390-
memory_strategy_->remove_guard_condition(&node_ptr->get_notify_guard_condition());
387+
memory_strategy_->remove_guard_condition(node_ptr->get_notify_guard_condition().get());
391388
weak_nodes_to_guard_conditions_.erase(node_ptr);
392389

393390
std::atomic_bool & has_executor = node_ptr->get_associated_with_executor_atomic();
@@ -500,7 +497,7 @@ Executor::cancel()
500497
{
501498
spinning.store(false);
502499
try {
503-
interrupt_guard_condition_.trigger();
500+
interrupt_guard_condition_->trigger();
504501
} catch (const rclcpp::exceptions::RCLError & ex) {
505502
throw std::runtime_error(
506503
std::string("Failed to trigger guard condition in cancel: ") + ex.what());
@@ -549,7 +546,7 @@ Executor::execute_any_executable(AnyExecutable & any_exec)
549546
// Wake the wait, because it may need to be recalculated or work that
550547
// was previously blocked is now available.
551548
try {
552-
interrupt_guard_condition_.trigger();
549+
interrupt_guard_condition_->trigger();
553550
} catch (const rclcpp::exceptions::RCLError & ex) {
554551
throw std::runtime_error(
555552
std::string(

rclcpp/src/rclcpp/executors/executor_notify_waitable.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,12 @@ ExecutorNotifyWaitable::take_data()
100100
}
101101

102102
void
103-
ExecutorNotifyWaitable::add_guard_condition(rclcpp::GuardCondition::WeakPtr guard_condition)
103+
ExecutorNotifyWaitable::add_guard_condition(rclcpp::GuardCondition::WeakPtr weak_guard_condition)
104104
{
105105
std::lock_guard<std::mutex> lock(guard_condition_mutex_);
106-
if (notify_guard_conditions_.count(guard_condition) == 0) {
107-
notify_guard_conditions_.insert(guard_condition);
106+
auto guard_condition = weak_guard_condition.lock();
107+
if (guard_condition && notify_guard_conditions_.count(weak_guard_condition) == 0) {
108+
notify_guard_conditions_.insert(weak_guard_condition);
108109
}
109110
}
110111

rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ StaticExecutorEntitiesCollector::execute(std::shared_ptr<void> & data)
109109
std::lock_guard<std::mutex> guard{new_nodes_mutex_};
110110
for (const auto & weak_node : new_nodes_) {
111111
if (auto node_ptr = weak_node.lock()) {
112-
const auto & gc = node_ptr->get_notify_guard_condition();
113-
weak_nodes_to_guard_conditions_[node_ptr] = &gc;
112+
weak_nodes_to_guard_conditions_[node_ptr] = node_ptr->get_notify_guard_condition().get();
114113
}
115114
}
116115
new_nodes_.clear();

rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ StaticSingleThreadedExecutor::add_callback_group(
139139
bool is_new_node = entities_collector_->add_callback_group(group_ptr, node_ptr);
140140
if (is_new_node && notify) {
141141
// Interrupt waiting to handle new node
142-
interrupt_guard_condition_.trigger();
142+
interrupt_guard_condition_->trigger();
143143
}
144144
}
145145

@@ -150,7 +150,7 @@ StaticSingleThreadedExecutor::add_node(
150150
bool is_new_node = entities_collector_->add_node(node_ptr);
151151
if (is_new_node && notify) {
152152
// Interrupt waiting to handle new node
153-
interrupt_guard_condition_.trigger();
153+
interrupt_guard_condition_->trigger();
154154
}
155155
}
156156

@@ -167,7 +167,7 @@ StaticSingleThreadedExecutor::remove_callback_group(
167167
bool node_removed = entities_collector_->remove_callback_group(group_ptr);
168168
// If the node was matched and removed, interrupt waiting
169169
if (node_removed && notify) {
170-
interrupt_guard_condition_.trigger();
170+
interrupt_guard_condition_->trigger();
171171
}
172172
}
173173

@@ -181,7 +181,7 @@ StaticSingleThreadedExecutor::remove_node(
181181
}
182182
// If the node was matched and removed, interrupt waiting
183183
if (notify) {
184-
interrupt_guard_condition_.trigger();
184+
interrupt_guard_condition_->trigger();
185185
}
186186
}
187187

0 commit comments

Comments
 (0)