Skip to content

Commit 53cc25d

Browse files
author
Mauro Passerino
committed
Use rclcpp::guard_condition
Signed-off-by: Mauro Passerino <[email protected]>
1 parent 2fe825b commit 53cc25d

32 files changed

+184
-312
lines changed

rclcpp/include/rclcpp/executor.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ class Executor
524524
std::atomic_bool spinning;
525525

526526
/// Guard condition for signaling the rmw layer to wake up for special events.
527-
rcl_guard_condition_t interrupt_guard_condition_ = rcl_get_zero_initialized_guard_condition();
527+
rclcpp::GuardCondition interrupt_guard_condition_;
528528

529529
std::shared_ptr<rclcpp::GuardCondition> shutdown_guard_condition_;
530530

@@ -548,7 +548,7 @@ class Executor
548548
spin_once_impl(std::chrono::nanoseconds timeout);
549549

550550
typedef std::map<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr,
551-
const rcl_guard_condition_t *,
551+
const rclcpp::GuardCondition *,
552552
std::owner_less<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr>>
553553
WeakNodesToGuardConditionsMap;
554554

rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class StaticExecutorEntitiesCollector final
6565
init(
6666
rcl_wait_set_t * p_wait_set,
6767
rclcpp::memory_strategy::MemoryStrategy::SharedPtr memory_strategy,
68-
rcl_guard_condition_t * executor_guard_condition);
68+
rclcpp::GuardCondition * executor_guard_condition);
6969

7070
/// Finalize StaticExecutorEntitiesCollector to clear resources
7171
RCLCPP_PUBLIC
@@ -326,7 +326,7 @@ class StaticExecutorEntitiesCollector final
326326
WeakCallbackGroupsToNodesMap weak_groups_to_nodes_associated_with_executor_;
327327

328328
typedef std::map<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr,
329-
const rcl_guard_condition_t *,
329+
const rclcpp::GuardCondition *,
330330
std::owner_less<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr>>
331331
WeakNodesToGuardConditionsMap;
332332
WeakNodesToGuardConditionsMap weak_nodes_to_guard_conditions_;

rclcpp/include/rclcpp/experimental/subscription_intra_process.hpp

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
6767
const std::string & topic_name,
6868
rmw_qos_profile_t qos_profile,
6969
rclcpp::IntraProcessBufferType buffer_type)
70-
: SubscriptionIntraProcessBase(topic_name, qos_profile),
70+
: SubscriptionIntraProcessBase(context, topic_name, qos_profile),
7171
any_callback_(callback)
7272
{
7373
if (!std::is_same<MessageT, CallbackMessageT>::value) {
@@ -80,18 +80,6 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
8080
qos_profile,
8181
allocator);
8282

83-
// Create the guard condition.
84-
rcl_guard_condition_options_t guard_condition_options =
85-
rcl_guard_condition_get_default_options();
86-
87-
gc_ = rcl_get_zero_initialized_guard_condition();
88-
rcl_ret_t ret = rcl_guard_condition_init(
89-
&gc_, context->get_rcl_context().get(), guard_condition_options);
90-
91-
if (RCL_RET_OK != ret) {
92-
throw std::runtime_error("SubscriptionIntraProcess init error initializing guard condition");
93-
}
94-
9583
TRACEPOINT(
9684
rclcpp_subscription_callback_added,
9785
static_cast<const void *>(this),
@@ -104,15 +92,7 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
10492
#endif
10593
}
10694

107-
~SubscriptionIntraProcess()
108-
{
109-
if (rcl_guard_condition_fini(&gc_) != RCL_RET_OK) {
110-
RCUTILS_LOG_ERROR_NAMED(
111-
"rclcpp",
112-
"Failed to destroy guard condition: %s",
113-
rcutils_get_error_string().str);
114-
}
115-
}
95+
~SubscriptionIntraProcess() = default;
11696

11797
bool
11898
is_ready(rcl_wait_set_t * wait_set)
@@ -168,8 +148,7 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
168148
void
169149
trigger_guard_condition()
170150
{
171-
rcl_ret_t ret = rcl_trigger_guard_condition(&gc_);
172-
(void)ret;
151+
gc_.trigger();
173152
}
174153

175154
template<typename T>

rclcpp/include/rclcpp/experimental/subscription_intra_process_base.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "rcl/error_handling.h"
2727

28+
#include "rclcpp/guard_condition.hpp"
2829
#include "rclcpp/type_support_decl.hpp"
2930
#include "rclcpp/waitable.hpp"
3031

@@ -39,8 +40,10 @@ class SubscriptionIntraProcessBase : public rclcpp::Waitable
3940
RCLCPP_SMART_PTR_ALIASES_ONLY(SubscriptionIntraProcessBase)
4041

4142
RCLCPP_PUBLIC
42-
SubscriptionIntraProcessBase(const std::string & topic_name, rmw_qos_profile_t qos_profile)
43-
: topic_name_(topic_name), qos_profile_(qos_profile)
43+
SubscriptionIntraProcessBase(
44+
rclcpp::Context::SharedPtr context,
45+
const std::string & topic_name, rmw_qos_profile_t qos_profile)
46+
: gc_(context), topic_name_(topic_name), qos_profile_(qos_profile)
4447
{}
4548

4649
virtual ~SubscriptionIntraProcessBase() = default;
@@ -82,7 +85,7 @@ class SubscriptionIntraProcessBase : public rclcpp::Waitable
8285

8386
protected:
8487
std::recursive_mutex reentrant_mutex_;
85-
rcl_guard_condition_t gc_;
88+
rclcpp::GuardCondition gc_;
8689

8790
private:
8891
virtual void

rclcpp/include/rclcpp/graph_listener.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "rcl/guard_condition.h"
2525
#include "rcl/wait.h"
2626
#include "rclcpp/context.hpp"
27+
#include "rclcpp/guard_condition.hpp"
2728
#include "rclcpp/macros.hpp"
2829
#include "rclcpp/node_interfaces/node_graph_interface.hpp"
2930
#include "rclcpp/visibility_control.hpp"
@@ -187,7 +188,7 @@ class GraphListener : public std::enable_shared_from_this<GraphListener>
187188
mutable std::mutex node_graph_interfaces_mutex_;
188189
std::vector<rclcpp::node_interfaces::NodeGraphInterface *> node_graph_interfaces_;
189190

190-
rcl_guard_condition_t interrupt_guard_condition_ = rcl_get_zero_initialized_guard_condition();
191+
rclcpp::GuardCondition interrupt_guard_condition_;
191192
rcl_wait_set_t wait_set_ = rcl_get_zero_initialized_wait_set();
192193
};
193194

rclcpp/include/rclcpp/guard_condition.hpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ class GuardCondition
4747
RCLCPP_PUBLIC
4848
explicit GuardCondition(
4949
rclcpp::Context::SharedPtr context =
50-
rclcpp::contexts::get_global_default_context());
50+
rclcpp::contexts::get_global_default_context(),
51+
rcl_guard_condition_options_t guard_condition_options =
52+
rcl_guard_condition_get_default_options());
5153

5254
RCLCPP_PUBLIC
5355
virtual
@@ -89,6 +91,15 @@ class GuardCondition
8991
bool
9092
exchange_in_use_by_wait_set_state(bool in_use_state);
9193

94+
/// Adds the guard condition to a waitset
95+
/**
96+
* This function is thread-safe.
97+
* \param[in] wait_set pointer to a wait set where to add the guard condition
98+
*/
99+
RCLCPP_PUBLIC
100+
void
101+
add_to_wait_set(rcl_wait_set_t * wait_set) const;
102+
92103
protected:
93104
rclcpp::Context::SharedPtr context_;
94105
rcl_guard_condition_t rcl_guard_condition_;

rclcpp/include/rclcpp/memory_strategy.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,11 @@ class RCLCPP_PUBLIC MemoryStrategy
6464
virtual void clear_handles() = 0;
6565
virtual void remove_null_handles(rcl_wait_set_t * wait_set) = 0;
6666

67-
virtual void add_guard_condition(const rcl_guard_condition_t * guard_condition) = 0;
67+
virtual void
68+
add_guard_condition(const rclcpp::GuardCondition * guard_condition) = 0;
6869

69-
virtual void remove_guard_condition(const rcl_guard_condition_t * guard_condition) = 0;
70+
virtual void
71+
remove_guard_condition(const rclcpp::GuardCondition * guard_condition) = 0;
7072

7173
virtual void
7274
get_next_subscription(

rclcpp/include/rclcpp/node_interfaces/node_base.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,13 @@ class NodeBase : public NodeBaseInterface
104104
get_associated_with_executor_atomic() override;
105105

106106
RCLCPP_PUBLIC
107-
rcl_guard_condition_t *
107+
const rcl_guard_condition_t *
108108
get_notify_guard_condition() override;
109109

110+
RCLCPP_PUBLIC
111+
rclcpp::GuardCondition *
112+
get_notify_rclcpp_guard_condition() override;
113+
110114
RCLCPP_PUBLIC
111115
std::unique_lock<std::recursive_mutex>
112116
acquire_notify_guard_condition_lock() const override;
@@ -122,6 +126,10 @@ class NodeBase : public NodeBaseInterface
122126
resolve_topic_or_service_name(
123127
const std::string & name, bool is_service, bool only_expand = false) const override;
124128

129+
RCLCPP_PUBLIC
130+
void
131+
trigger_notify_guard_condition() override;
132+
125133
private:
126134
RCLCPP_DISABLE_COPY(NodeBase)
127135

@@ -138,7 +146,7 @@ class NodeBase : public NodeBaseInterface
138146

139147
/// Guard condition for notifying the Executor of changes to this node.
140148
mutable std::recursive_mutex notify_guard_condition_mutex_;
141-
rcl_guard_condition_t notify_guard_condition_ = rcl_get_zero_initialized_guard_condition();
149+
rclcpp::GuardCondition notify_guard_condition_;
142150
bool notify_guard_condition_is_valid_;
143151
};
144152

rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "rclcpp/callback_group.hpp"
2626
#include "rclcpp/context.hpp"
27+
#include "rclcpp/guard_condition.hpp"
2728
#include "rclcpp/macros.hpp"
2829
#include "rclcpp/visibility_control.hpp"
2930

@@ -142,9 +143,20 @@ class NodeBaseInterface
142143
*/
143144
RCLCPP_PUBLIC
144145
virtual
145-
rcl_guard_condition_t *
146+
const rcl_guard_condition_t *
146147
get_notify_guard_condition() = 0;
147148

149+
/// Return guard condition that should be notified when the internal node state changes.
150+
/**
151+
* For example, this should be notified when a publisher is added or removed.
152+
*
153+
* \return the GuardCondition if it is valid, else nullptr
154+
*/
155+
RCLCPP_PUBLIC
156+
virtual
157+
rclcpp::GuardCondition *
158+
get_notify_rclcpp_guard_condition() = 0;
159+
148160
/// Acquire and return a scoped lock that protects the notify guard condition.
149161
/** This should be used when triggering the notify guard condition. */
150162
RCLCPP_PUBLIC
@@ -170,6 +182,12 @@ class NodeBaseInterface
170182
std::string
171183
resolve_topic_or_service_name(
172184
const std::string & name, bool is_service, bool only_expand = false) const = 0;
185+
186+
/// Trigger the node's notify guard condition.
187+
RCLCPP_PUBLIC
188+
virtual
189+
void
190+
trigger_notify_guard_condition() = 0;
173191
};
174192

175193
} // namespace node_interfaces

rclcpp/include/rclcpp/strategies/allocator_memory_strategy.hpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class AllocatorMemoryStrategy : public memory_strategy::MemoryStrategy
6161
allocator_ = std::make_shared<VoidAlloc>();
6262
}
6363

64-
void add_guard_condition(const rcl_guard_condition_t * guard_condition) override
64+
void add_guard_condition(const rclcpp::GuardCondition * guard_condition) override
6565
{
6666
for (const auto & existing_guard_condition : guard_conditions_) {
6767
if (existing_guard_condition == guard_condition) {
@@ -71,7 +71,7 @@ class AllocatorMemoryStrategy : public memory_strategy::MemoryStrategy
7171
guard_conditions_.push_back(guard_condition);
7272
}
7373

74-
void remove_guard_condition(const rcl_guard_condition_t * guard_condition) override
74+
void remove_guard_condition(const rclcpp::GuardCondition * guard_condition) override
7575
{
7676
for (auto it = guard_conditions_.begin(); it != guard_conditions_.end(); ++it) {
7777
if (*it == guard_condition) {
@@ -240,13 +240,7 @@ class AllocatorMemoryStrategy : public memory_strategy::MemoryStrategy
240240
}
241241

242242
for (auto guard_condition : guard_conditions_) {
243-
if (rcl_wait_set_add_guard_condition(wait_set, guard_condition, NULL) != RCL_RET_OK) {
244-
RCUTILS_LOG_ERROR_NAMED(
245-
"rclcpp",
246-
"Couldn't add guard_condition to wait set: %s",
247-
rcl_get_error_string().str);
248-
return false;
249-
}
243+
guard_condition->add_to_wait_set(wait_set);
250244
}
251245

252246
for (auto waitable : waitable_handles_) {
@@ -504,7 +498,7 @@ class AllocatorMemoryStrategy : public memory_strategy::MemoryStrategy
504498
using VectorRebind =
505499
std::vector<T, typename std::allocator_traits<Alloc>::template rebind_alloc<T>>;
506500

507-
VectorRebind<const rcl_guard_condition_t *> guard_conditions_;
501+
VectorRebind<const rclcpp::GuardCondition *> guard_conditions_;
508502

509503
VectorRebind<std::shared_ptr<const rcl_subscription_t>> subscription_handles_;
510504
VectorRebind<std::shared_ptr<const rcl_service_t>> service_handles_;

0 commit comments

Comments
 (0)