ROS 2 rclcpp + rcl - jazzy  jazzy
ROS 2 C++ Client Library with ROS Client Library
callback_group.hpp
1 // Copyright 2014 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 #ifndef RCLCPP__CALLBACK_GROUP_HPP_
16 #define RCLCPP__CALLBACK_GROUP_HPP_
17 
18 #include <atomic>
19 #include <functional>
20 #include <memory>
21 #include <mutex>
22 #include <vector>
23 
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"
33 
34 namespace rclcpp
35 {
36 
37 // Forward declarations for friend statement in class CallbackGroup
38 namespace node_interfaces
39 {
40 class NodeServices;
41 class NodeTimers;
42 class NodeTopics;
43 class NodeWaitables;
44 } // namespace node_interfaces
45 
46 enum class CallbackGroupType
47 {
48  MutuallyExclusive,
49  Reentrant
50 };
51 
53 {
58 
59 public:
60  RCLCPP_SMART_PTR_DEFINITIONS(CallbackGroup)
61 
62 
96  [[deprecated("Use CallbackGroup constructor with context function argument")]]
97  RCLCPP_PUBLIC
98  explicit CallbackGroup(
99  CallbackGroupType group_type,
101 
103 
137  RCLCPP_PUBLIC
138  explicit CallbackGroup(
139  CallbackGroupType group_type,
140  rclcpp::Context::WeakPtr context,
142 
144  RCLCPP_PUBLIC
145  ~CallbackGroup();
146 
147  template<typename Function>
148  rclcpp::SubscriptionBase::SharedPtr
149  find_subscription_ptrs_if(Function func) const
150  {
151  return _find_ptrs_if_impl<rclcpp::SubscriptionBase, Function>(func, subscription_ptrs_);
152  }
153 
154  template<typename Function>
155  rclcpp::TimerBase::SharedPtr
156  find_timer_ptrs_if(Function func) const
157  {
158  return _find_ptrs_if_impl<rclcpp::TimerBase, Function>(func, timer_ptrs_);
159  }
160 
161  template<typename Function>
162  rclcpp::ServiceBase::SharedPtr
163  find_service_ptrs_if(Function func) const
164  {
165  return _find_ptrs_if_impl<rclcpp::ServiceBase, Function>(func, service_ptrs_);
166  }
167 
168  template<typename Function>
169  rclcpp::ClientBase::SharedPtr
170  find_client_ptrs_if(Function func) const
171  {
172  return _find_ptrs_if_impl<rclcpp::ClientBase, Function>(func, client_ptrs_);
173  }
174 
175  template<typename Function>
176  rclcpp::Waitable::SharedPtr
177  find_waitable_ptrs_if(Function func) const
178  {
179  return _find_ptrs_if_impl<rclcpp::Waitable, Function>(func, waitable_ptrs_);
180  }
181 
183 
186  RCLCPP_PUBLIC
187  size_t
188  size() const;
189 
191 
199  RCLCPP_PUBLIC
200  std::atomic_bool &
202 
204 
207  RCLCPP_PUBLIC
208  const CallbackGroupType &
209  type() const;
210 
212 
219  RCLCPP_PUBLIC
220  void
222  std::function<void(const rclcpp::SubscriptionBase::SharedPtr &)> sub_func,
223  std::function<void(const rclcpp::ServiceBase::SharedPtr &)> service_func,
224  std::function<void(const rclcpp::ClientBase::SharedPtr &)> client_func,
225  std::function<void(const rclcpp::TimerBase::SharedPtr &)> timer_func,
226  std::function<void(const rclcpp::Waitable::SharedPtr &)> waitable_func) const;
227 
229 
240  RCLCPP_PUBLIC
241  std::atomic_bool &
243 
245 
249  RCLCPP_PUBLIC
250  bool
252 
254 
257  RCLCPP_PUBLIC
258  rclcpp::GuardCondition::SharedPtr
260 
262  RCLCPP_PUBLIC
263  void
265 
266 protected:
267  RCLCPP_DISABLE_COPY(CallbackGroup)
268 
269  RCLCPP_PUBLIC
270  void
271  add_publisher(const rclcpp::PublisherBase::SharedPtr publisher_ptr);
272 
273  RCLCPP_PUBLIC
274  void
275  add_subscription(const rclcpp::SubscriptionBase::SharedPtr subscription_ptr);
276 
277  RCLCPP_PUBLIC
278  void
279  add_timer(const rclcpp::TimerBase::SharedPtr timer_ptr);
280 
281  RCLCPP_PUBLIC
282  void
283  add_service(const rclcpp::ServiceBase::SharedPtr service_ptr);
284 
285  RCLCPP_PUBLIC
286  void
287  add_client(const rclcpp::ClientBase::SharedPtr client_ptr);
288 
289  RCLCPP_PUBLIC
290  void
291  add_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr);
292 
293  RCLCPP_PUBLIC
294  void
295  remove_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr) noexcept;
296 
297  CallbackGroupType type_;
298  // Mutex to protect the subsequent vectors of pointers.
299  mutable std::mutex mutex_;
300  std::atomic_bool associated_with_executor_;
301  std::vector<rclcpp::SubscriptionBase::WeakPtr> subscription_ptrs_;
302  std::vector<rclcpp::TimerBase::WeakPtr> timer_ptrs_;
303  std::vector<rclcpp::ServiceBase::WeakPtr> service_ptrs_;
304  std::vector<rclcpp::ClientBase::WeakPtr> client_ptrs_;
305  std::vector<rclcpp::Waitable::WeakPtr> waitable_ptrs_;
306  std::atomic_bool can_be_taken_from_;
307  const bool automatically_add_to_executor_with_node_;
308  // defer the creation of the guard condition
309  std::shared_ptr<rclcpp::GuardCondition> notify_guard_condition_ = nullptr;
310  std::recursive_mutex notify_guard_condition_mutex_;
311 
312  rclcpp::Context::WeakPtr context_;
313 
314 private:
315  template<typename TypeT, typename Function>
316  typename TypeT::SharedPtr _find_ptrs_if_impl(
317  Function func, const std::vector<typename TypeT::WeakPtr> & vect_ptrs) const
318  {
319  std::lock_guard<std::mutex> lock(mutex_);
320  for (auto & weak_ptr : vect_ptrs) {
321  auto ref_ptr = weak_ptr.lock();
322  if (ref_ptr && func(ref_ptr)) {
323  return ref_ptr;
324  }
325  }
326  return typename TypeT::SharedPtr();
327  }
328 };
329 
330 } // namespace rclcpp
331 
332 #endif // RCLCPP__CALLBACK_GROUP_HPP_
RCLCPP_PUBLIC ~CallbackGroup()
Default destructor.
RCLCPP_PUBLIC rclcpp::GuardCondition::SharedPtr get_notify_guard_condition()
Retrieve the guard condition used to signal changes to this callback group.
RCLCPP_PUBLIC std::atomic_bool & get_associated_with_executor_atomic()
Return a reference to the 'associated with executor' atomic boolean.
RCLCPP_PUBLIC CallbackGroup(CallbackGroupType group_type, bool automatically_add_to_executor_with_node=true)
Constructor for CallbackGroup.
RCLCPP_PUBLIC void trigger_notify_guard_condition()
Trigger the notify guard condition.
RCLCPP_PUBLIC void collect_all_ptrs(std::function< void(const rclcpp::SubscriptionBase::SharedPtr &)> sub_func, std::function< void(const rclcpp::ServiceBase::SharedPtr &)> service_func, std::function< void(const rclcpp::ClientBase::SharedPtr &)> client_func, std::function< void(const rclcpp::TimerBase::SharedPtr &)> timer_func, std::function< void(const rclcpp::Waitable::SharedPtr &)> waitable_func) const
Collect all of the entity pointers contained in this callback group.
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 const CallbackGroupType & type() const
Get the group type.
RCLCPP_PUBLIC std::atomic_bool & can_be_taken_from()
Return a reference to the 'can be taken' atomic boolean.
RCLCPP_PUBLIC size_t size() const
Get the total number of entities in this callback group.
Implementation of the NodeServices part of the Node API.
Implementation of the NodeTimers part of the Node API.
Definition: node_timers.hpp:32
Implementation of the NodeTopics part of the Node API.
Definition: node_topics.hpp:42
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.