17 #include "rclcpp/exceptions.hpp"
18 #include "rclcpp/executors/executor_notify_waitable.hpp"
26 : execute_callback_(on_execute_callback)
32 std::lock_guard<std::mutex> lock(other.guard_condition_mutex_);
33 this->execute_callback_ = other.execute_callback_;
34 this->notify_guard_conditions_ = other.notify_guard_conditions_;
37 ExecutorNotifyWaitable & ExecutorNotifyWaitable::operator=(ExecutorNotifyWaitable & other)
40 std::lock_guard<std::mutex> lock(other.guard_condition_mutex_);
41 this->execute_callback_ = other.execute_callback_;
42 this->notify_guard_conditions_ = other.notify_guard_conditions_;
50 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
56 for (
auto weak_guard_condition : this->notify_guard_conditions_) {
57 auto guard_condition = weak_guard_condition.lock();
58 if (!guard_condition) {
continue;}
64 rclcpp::exceptions::throw_from_rcl_error(
65 ret,
"failed to add guard condition to wait set");
73 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
75 bool any_ready =
false;
79 if (
nullptr == rcl_guard_condition) {
82 for (
const auto & weak_guard_condition : this->notify_guard_conditions_) {
83 auto guard_condition = weak_guard_condition.lock();
84 if (guard_condition && &guard_condition->get_rcl_guard_condition() == rcl_guard_condition) {
97 this->execute_callback_();
100 std::shared_ptr<void>
106 std::shared_ptr<void>
120 auto gc_callback = [callback](
size_t count) {
124 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
126 on_ready_callback_ = gc_callback;
127 for (
auto weak_gc : notify_guard_conditions_) {
128 auto gc = weak_gc.lock();
132 gc->set_on_trigger_callback(on_ready_callback_);
140 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
142 on_ready_callback_ =
nullptr;
143 for (
auto weak_gc : notify_guard_conditions_) {
144 auto gc = weak_gc.lock();
148 gc->set_on_trigger_callback(
nullptr);
155 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
156 auto guard_condition = weak_guard_condition.lock();
157 if (guard_condition && notify_guard_conditions_.count(weak_guard_condition) == 0) {
158 notify_guard_conditions_.insert(weak_guard_condition);
159 if (on_ready_callback_) {
160 guard_condition->set_on_trigger_callback(on_ready_callback_);
168 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
169 if (notify_guard_conditions_.count(weak_guard_condition) != 0) {
170 notify_guard_conditions_.erase(weak_guard_condition);
171 auto guard_condition = weak_guard_condition.lock();
173 if (guard_condition && on_ready_callback_) {
174 guard_condition->set_on_trigger_callback(
nullptr);
182 std::lock_guard<std::mutex> lock(guard_condition_mutex_);
183 return notify_guard_conditions_.size();
RCLCPP_PUBLIC std::shared_ptr< void > take_data_by_entity_id(size_t id) override
Take the data from an entity ID so that it can be consumed with execute.
RCLCPP_PUBLIC void execute(const std::shared_ptr< void > &data) override
Perform work associated with the waitable.
RCLCPP_PUBLIC void add_guard_condition(rclcpp::GuardCondition::WeakPtr guard_condition)
Add a guard condition to be waited on.
RCLCPP_PUBLIC size_t get_number_of_ready_guard_conditions() override
Get the number of ready guard_conditions.
RCLCPP_PUBLIC std::shared_ptr< void > take_data() override
Retrieve data to be used in the next execute call.
RCLCPP_PUBLIC ExecutorNotifyWaitable(std::function< void(void)> on_execute_callback={})
RCLCPP_PUBLIC void add_to_wait_set(rcl_wait_set_t &wait_set) override
Add conditions to the wait set.
RCLCPP_PUBLIC void set_on_ready_callback(std::function< void(size_t, int)> callback) override
Set a callback to be called whenever the waitable becomes ready.
RCLCPP_PUBLIC void clear_on_ready_callback() override
Unset any callback registered via set_on_ready_callback.
RCLCPP_PUBLIC bool is_ready(const rcl_wait_set_t &wait_set) override
Check conditions against the wait set.
RCLCPP_PUBLIC void remove_guard_condition(rclcpp::GuardCondition::WeakPtr weak_guard_condition)
Remove a guard condition from being waited on.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
Handle for a rcl guard condition.
Container for subscription's, guard condition's, etc to be waited on.
size_t size_of_guard_conditions
Number of guard_conditions.
const rcl_guard_condition_t ** guard_conditions
Storage for guard condition pointers.
#define RCL_RET_OK
Success return code.
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_wait_set_add_guard_condition(rcl_wait_set_t *wait_set, const rcl_guard_condition_t *guard_condition, size_t *index)
Store a pointer to the guard condition in the next empty spot in the set.