15 #ifndef RCLCPP__CALLBACK_GROUP_HPP_
16 #define RCLCPP__CALLBACK_GROUP_HPP_
24 #include "rclcpp/client.hpp"
25 #include "rclcpp/context.hpp"
26 #include "rclcpp/guard_condition.hpp"
27 #include "rclcpp/publisher_base.hpp"
28 #include "rclcpp/service.hpp"
29 #include "rclcpp/subscription_base.hpp"
30 #include "rclcpp/timer.hpp"
31 #include "rclcpp/visibility_control.hpp"
32 #include "rclcpp/waitable.hpp"
38 namespace node_interfaces
46 enum class CallbackGroupType
98 CallbackGroupType group_type,
105 template<
typename Function>
106 rclcpp::SubscriptionBase::SharedPtr
107 find_subscription_ptrs_if(Function func)
const
109 return _find_ptrs_if_impl<rclcpp::SubscriptionBase, Function>(func, subscription_ptrs_);
112 template<
typename Function>
113 rclcpp::TimerBase::SharedPtr
114 find_timer_ptrs_if(Function func)
const
116 return _find_ptrs_if_impl<rclcpp::TimerBase, Function>(func, timer_ptrs_);
119 template<
typename Function>
120 rclcpp::ServiceBase::SharedPtr
121 find_service_ptrs_if(Function func)
const
123 return _find_ptrs_if_impl<rclcpp::ServiceBase, Function>(func, service_ptrs_);
126 template<
typename Function>
127 rclcpp::ClientBase::SharedPtr
128 find_client_ptrs_if(Function func)
const
130 return _find_ptrs_if_impl<rclcpp::ClientBase, Function>(func, client_ptrs_);
133 template<
typename Function>
134 rclcpp::Waitable::SharedPtr
135 find_waitable_ptrs_if(Function func)
const
137 return _find_ptrs_if_impl<rclcpp::Waitable, Function>(func, waitable_ptrs_);
145 const CallbackGroupType &
149 void collect_all_ptrs(
150 std::function<
void(
const rclcpp::SubscriptionBase::SharedPtr &)> sub_func,
151 std::function<
void(
const rclcpp::ServiceBase::SharedPtr &)> service_func,
152 std::function<
void(
const rclcpp::ClientBase::SharedPtr &)> client_func,
153 std::function<
void(
const rclcpp::TimerBase::SharedPtr &)> timer_func,
154 std::function<
void(
const rclcpp::Waitable::SharedPtr &)> waitable_func)
const;
183 rclcpp::GuardCondition::SharedPtr
196 add_publisher(
const rclcpp::PublisherBase::SharedPtr publisher_ptr);
200 add_subscription(
const rclcpp::SubscriptionBase::SharedPtr subscription_ptr);
204 add_timer(
const rclcpp::TimerBase::SharedPtr timer_ptr);
208 add_service(
const rclcpp::ServiceBase::SharedPtr service_ptr);
212 add_client(
const rclcpp::ClientBase::SharedPtr client_ptr);
216 add_waitable(
const rclcpp::Waitable::SharedPtr waitable_ptr);
220 remove_waitable(
const rclcpp::Waitable::SharedPtr waitable_ptr) noexcept;
222 CallbackGroupType type_;
224 mutable std::mutex mutex_;
225 std::atomic_bool associated_with_executor_;
226 std::vector<rclcpp::SubscriptionBase::WeakPtr> subscription_ptrs_;
227 std::vector<rclcpp::TimerBase::WeakPtr> timer_ptrs_;
228 std::vector<rclcpp::ServiceBase::WeakPtr> service_ptrs_;
229 std::vector<rclcpp::ClientBase::WeakPtr> client_ptrs_;
230 std::vector<rclcpp::Waitable::WeakPtr> waitable_ptrs_;
231 std::atomic_bool can_be_taken_from_;
232 const bool automatically_add_to_executor_with_node_;
234 std::shared_ptr<rclcpp::GuardCondition> notify_guard_condition_ =
nullptr;
235 std::recursive_mutex notify_guard_condition_mutex_;
238 template<
typename TypeT,
typename Function>
239 typename TypeT::SharedPtr _find_ptrs_if_impl(
240 Function func,
const std::vector<typename TypeT::WeakPtr> & vect_ptrs)
const
242 std::lock_guard<std::mutex> lock(mutex_);
243 for (
auto & weak_ptr : vect_ptrs) {
244 auto ref_ptr = weak_ptr.lock();
245 if (ref_ptr && func(ref_ptr)) {
249 return typename TypeT::SharedPtr();
RCLCPP_PUBLIC ~CallbackGroup()
Default destructor.
RCLCPP_PUBLIC std::atomic_bool & get_associated_with_executor_atomic()
Return a reference to the 'associated with executor' atomic boolean.
RCLCPP_PUBLIC rclcpp::GuardCondition::SharedPtr get_notify_guard_condition(const rclcpp::Context::SharedPtr context_ptr)
Defer creating the notify guard condition and return it.
RCLCPP_PUBLIC void trigger_notify_guard_condition()
Trigger the notify guard condition.
RCLCPP_PUBLIC bool automatically_add_to_executor_with_node() const
Return true if this callback group should be automatically added to an executor by the node.
RCLCPP_PUBLIC CallbackGroup(CallbackGroupType group_type, bool automatically_add_to_executor_with_node=true)
Constructor for CallbackGroup.
Implementation of the NodeServices part of the Node API.
Implementation of the NodeTimers part of the Node API.
Implementation of the NodeTopics part of the Node API.
Implementation of the NodeWaitables part of the Node API.
RCLCPP_PUBLIC void remove_waitable(rclcpp::Waitable::SharedPtr waitable_ptr, rclcpp::CallbackGroup::SharedPtr group) noexcept override
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.