15 #ifndef RCLCPP__STRATEGIES__ALLOCATOR_MEMORY_STRATEGY_HPP_ 16 #define RCLCPP__STRATEGIES__ALLOCATOR_MEMORY_STRATEGY_HPP_ 34 namespace memory_strategies
36 namespace allocator_memory_strategy
45 template<
typename Alloc = std::allocator<
void>>
56 allocator_ = std::make_shared<VoidAlloc>(*allocator.get());
61 allocator_ = std::make_shared<VoidAlloc>();
66 for (
const auto & existing_guard_condition : guard_conditions_) {
67 if (existing_guard_condition == guard_condition) {
71 guard_conditions_.push_back(guard_condition);
76 for (
auto it = guard_conditions_.begin(); it != guard_conditions_.end(); ++it) {
77 if (*it == guard_condition) {
78 guard_conditions_.erase(it);
86 subscription_handles_.clear();
87 service_handles_.clear();
88 client_handles_.clear();
89 timer_handles_.clear();
96 subscription_handles_[i].reset();
101 service_handles_[i].reset();
106 client_handles_[i].reset();
110 if (!wait_set->
timers[i]) {
111 timer_handles_[i].reset();
115 subscription_handles_.erase(
116 std::remove(subscription_handles_.begin(), subscription_handles_.end(),
nullptr),
117 subscription_handles_.end()
120 service_handles_.erase(
121 std::remove(service_handles_.begin(), service_handles_.end(),
nullptr),
122 service_handles_.end()
125 client_handles_.erase(
126 std::remove(client_handles_.begin(), client_handles_.end(),
nullptr),
127 client_handles_.end()
130 timer_handles_.erase(
131 std::remove(timer_handles_.begin(), timer_handles_.end(),
nullptr),
138 bool has_invalid_weak_nodes =
false;
139 for (
auto & weak_node : weak_nodes) {
140 auto node = weak_node.lock();
142 has_invalid_weak_nodes =
true;
145 for (
auto & weak_group : node->get_callback_groups()) {
146 auto group = weak_group.lock();
147 if (!group || !group->can_be_taken_from().load()) {
150 for (
auto & weak_subscription : group->get_subscription_ptrs()) {
151 auto subscription = weak_subscription.lock();
153 subscription_handles_.push_back(subscription->get_subscription_handle());
154 if (subscription->get_intra_process_subscription_handle()) {
155 subscription_handles_.push_back(
156 subscription->get_intra_process_subscription_handle());
160 for (
auto & weak_service : group->get_service_ptrs()) {
161 auto service = weak_service.lock();
163 service_handles_.push_back(service->get_service_handle());
166 for (
auto & weak_client : group->get_client_ptrs()) {
167 auto client = weak_client.lock();
169 client_handles_.push_back(client->get_client_handle());
172 for (
auto & weak_timer : group->get_timer_ptrs()) {
173 auto timer = weak_timer.lock();
175 timer_handles_.push_back(timer->get_timer_handle());
180 return has_invalid_weak_nodes;
185 for (
auto subscription : subscription_handles_) {
194 for (
auto client : client_handles_) {
203 for (
auto service : service_handles_) {
212 for (
auto timer : timer_handles_) {
221 for (
auto guard_condition : guard_conditions_) {
225 "Couldn't add guard_condition to wait set: %s",
238 auto it = subscription_handles_.begin();
239 while (it != subscription_handles_.end()) {
243 bool is_intra_process =
false;
244 if (subscription->get_intra_process_subscription_handle()) {
245 is_intra_process = subscription->get_intra_process_subscription_handle() == *it;
252 it = subscription_handles_.erase(it);
255 if (!group->can_be_taken_from().load()) {
262 if (is_intra_process) {
269 subscription_handles_.erase(it);
273 it = subscription_handles_.erase(it);
282 auto it = service_handles_.begin();
283 while (it != service_handles_.end()) {
291 it = service_handles_.erase(it);
294 if (!group->can_be_taken_from().load()) {
304 service_handles_.erase(it);
308 it = service_handles_.erase(it);
315 auto it = client_handles_.begin();
316 while (it != client_handles_.end()) {
324 it = client_handles_.erase(it);
327 if (!group->can_be_taken_from().load()) {
337 client_handles_.erase(it);
341 it = client_handles_.erase(it);
347 return rclcpp::allocator::get_rcl_allocator<void *, VoidAlloc>(*allocator_.
get());
352 return subscription_handles_.size();
357 return service_handles_.size();
362 return client_handles_.size();
367 return guard_conditions_.size();
372 return timer_handles_.size();
380 VectorRebind<const rcl_guard_condition_t *> guard_conditions_;
382 VectorRebind<std::shared_ptr<const rcl_subscription_t>> subscription_handles_;
383 VectorRebind<std::shared_ptr<const rcl_service_t>> service_handles_;
384 VectorRebind<std::shared_ptr<const rcl_client_t>> client_handles_;
385 VectorRebind<std::shared_ptr<const rcl_timer_t>> timer_handles_;
394 #endif // RCLCPP__STRATEGIES__ALLOCATOR_MEMORY_STRATEGY_HPP_
const rcl_service_t ** services
virtual void remove_null_handles(rcl_wait_set_t *wait_set)
Definition: allocator_memory_strategy.hpp:92
Delegate for handling memory allocations while the Executor is executing.
Definition: memory_strategy.hpp:40
virtual void get_next_subscription(executor::AnyExecutable &any_exec, const WeakNodeVector &weak_nodes)
Definition: allocator_memory_strategy.hpp:234
rclcpp::callback_group::CallbackGroup::SharedPtr callback_group
Definition: any_executable.hpp:49
AllocatorMemoryStrategy()
Definition: allocator_memory_strategy.hpp:59
rclcpp::SubscriptionBase::SharedPtr subscription
Definition: any_executable.hpp:43
rclcpp::ServiceBase::SharedPtr service
Definition: any_executable.hpp:46
rclcpp::ClientBase::SharedPtr client
Definition: any_executable.hpp:47
static rclcpp::ServiceBase::SharedPtr get_service_by_handle(std::shared_ptr< const rcl_service_t > service_handle, const WeakNodeVector &weak_nodes)
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base
Definition: any_executable.hpp:50
rcl_ret_t rcl_wait_set_add_subscription(rcl_wait_set_t *wait_set, const rcl_subscription_t *subscription)
size_t size_of_subscriptions
Definition: allocator_common.hpp:24
const rcl_client_t ** clients
static rclcpp::SubscriptionBase::SharedPtr get_subscription_by_handle(std::shared_ptr< const rcl_subscription_t > subscriber_handle, const WeakNodeVector &weak_nodes)
const rcl_timer_t ** timers
static rclcpp::node_interfaces::NodeBaseInterface::SharedPtr get_node_by_group(rclcpp::callback_group::CallbackGroup::SharedPtr group, const WeakNodeVector &weak_nodes)
static rclcpp::callback_group::CallbackGroup::SharedPtr get_group_by_client(rclcpp::ClientBase::SharedPtr client, const WeakNodeVector &weak_nodes)
size_t number_of_guard_conditions() const
Definition: allocator_memory_strategy.hpp:365
bool collect_entities(const WeakNodeVector &weak_nodes)
Definition: allocator_memory_strategy.hpp:136
Delegate for handling memory allocations while the Executor is executing.
Definition: allocator_memory_strategy.hpp:46
size_t number_of_ready_clients() const
Definition: allocator_memory_strategy.hpp:360
rcl_ret_t rcl_wait_set_add_guard_condition(rcl_wait_set_t *wait_set, const rcl_guard_condition_t *guard_condition)
typename std::allocator_traits< Alloc >::template rebind_traits< T > AllocRebind
Definition: allocator_common.hpp:30
#define RCLCPP_SMART_PTR_DEFINITIONS(...)
Definition: macros.hpp:36
void remove_guard_condition(const rcl_guard_condition_t *guard_condition)
Definition: allocator_memory_strategy.hpp:74
void clear_handles()
Definition: allocator_memory_strategy.hpp:84
rclcpp::SubscriptionBase::SharedPtr subscription_intra_process
Definition: any_executable.hpp:44
#define rcl_get_error_string_safe
size_t number_of_ready_timers() const
Definition: allocator_memory_strategy.hpp:370
rcl_ret_t rcl_wait_set_add_client(rcl_wait_set_t *wait_set, const rcl_client_t *client)
#define RCUTILS_LOG_ERROR_NAMED(name,...)
rcl_ret_t rcl_wait_set_add_service(rcl_wait_set_t *wait_set, const rcl_service_t *service)
virtual void get_next_service(executor::AnyExecutable &any_exec, const WeakNodeVector &weak_nodes)
Definition: allocator_memory_strategy.hpp:278
Definition: any_executable.hpp:34
static rclcpp::callback_group::CallbackGroup::SharedPtr get_group_by_service(rclcpp::ServiceBase::SharedPtr service, const WeakNodeVector &weak_nodes)
virtual rcl_allocator_t get_allocator()
Definition: allocator_memory_strategy.hpp:345
bool add_handles_to_wait_set(rcl_wait_set_t *wait_set)
Definition: allocator_memory_strategy.hpp:183
void add_guard_condition(const rcl_guard_condition_t *guard_condition)
Definition: allocator_memory_strategy.hpp:64
virtual void get_next_client(executor::AnyExecutable &any_exec, const WeakNodeVector &weak_nodes)
Definition: allocator_memory_strategy.hpp:313
typename allocator::AllocRebind< void *, Alloc > VoidAllocTraits
Definition: allocator_memory_strategy.hpp:51
static rclcpp::callback_group::CallbackGroup::SharedPtr get_group_by_subscription(rclcpp::SubscriptionBase::SharedPtr subscription, const WeakNodeVector &weak_nodes)
rcl_ret_t rcl_wait_set_add_timer(rcl_wait_set_t *wait_set, const rcl_timer_t *timer)
static rclcpp::ClientBase::SharedPtr get_client_by_handle(std::shared_ptr< const rcl_client_t > client_handle, const WeakNodeVector &weak_nodes)
size_t number_of_ready_subscriptions() const
Definition: allocator_memory_strategy.hpp:350
typename VoidAllocTraits::allocator_type VoidAlloc
Definition: allocator_memory_strategy.hpp:52
const rcl_subscription_t ** subscriptions
size_t number_of_ready_services() const
Definition: allocator_memory_strategy.hpp:355