.. _program_listing_file_include_rclcpp_experimental_executors_events_executor_simple_events_queue.hpp: Program Listing for File simple_events_queue.hpp ================================================ |exhale_lsh| :ref:`Return to documentation for file ` (``include/rclcpp/experimental/executors/events_executor/simple_events_queue.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright 2023 iRobot Corporation. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef RCLCPP__EXPERIMENTAL__EXECUTORS__EVENTS_EXECUTOR__SIMPLE_EVENTS_QUEUE_HPP_ #define RCLCPP__EXPERIMENTAL__EXECUTORS__EVENTS_EXECUTOR__SIMPLE_EVENTS_QUEUE_HPP_ #include #include #include #include #include "rclcpp/experimental/executors/events_executor/events_queue.hpp" namespace rclcpp { namespace experimental { namespace executors { class SimpleEventsQueue : public EventsQueue { public: RCLCPP_PUBLIC ~SimpleEventsQueue() override = default; RCLCPP_PUBLIC void enqueue(const rclcpp::experimental::executors::ExecutorEvent & event) override { rclcpp::experimental::executors::ExecutorEvent single_event = event; single_event.num_events = 1; { std::unique_lock lock(mutex_); for (size_t ev = 0; ev < event.num_events; ev++) { event_queue_.push(single_event); } } events_queue_cv_.notify_one(); } RCLCPP_PUBLIC bool dequeue( rclcpp::experimental::executors::ExecutorEvent & event, std::chrono::nanoseconds timeout = std::chrono::nanoseconds::max()) override { std::unique_lock lock(mutex_); // Initialize to true because it's only needed if we have a valid timeout bool has_data = true; if (timeout != std::chrono::nanoseconds::max()) { has_data = events_queue_cv_.wait_for(lock, timeout, [this]() {return !event_queue_.empty();}); } else { events_queue_cv_.wait(lock, [this]() {return !event_queue_.empty();}); } if (has_data) { event = event_queue_.front(); event_queue_.pop(); return true; } return false; } RCLCPP_PUBLIC bool empty() const override { std::unique_lock lock(mutex_); return event_queue_.empty(); } RCLCPP_PUBLIC size_t size() const override { std::unique_lock lock(mutex_); return event_queue_.size(); } private: // The underlying queue implementation std::queue event_queue_; // Mutex to protect read/write access to the queue mutable std::mutex mutex_; // Variable used to notify when an event is added to the queue std::condition_variable events_queue_cv_; }; } // namespace executors } // namespace experimental } // namespace rclcpp #endif // RCLCPP__EXPERIMENTAL__EXECUTORS__EVENTS_EXECUTOR__SIMPLE_EVENTS_QUEUE_HPP_