Add vectors to memory strategy and reserve space

This commit is contained in:
Jackie Kay 2015-09-28 12:51:13 -07:00
parent d8b7ce8e13
commit af9d64106b
4 changed files with 26 additions and 13 deletions

View file

@ -342,11 +342,11 @@ protected:
void void
wait_for_work(std::chrono::duration<int64_t, T> timeout = std::chrono::duration<int64_t, T>(-1)) wait_for_work(std::chrono::duration<int64_t, T> timeout = std::chrono::duration<int64_t, T>(-1))
{ {
memory_strategy_->subs.clear();
memory_strategy_->services.clear();
memory_strategy_->clients.clear();
// Collect the subscriptions and timers to be waited on // Collect the subscriptions and timers to be waited on
bool has_invalid_weak_nodes = false; bool has_invalid_weak_nodes = false;
std::vector<rclcpp::subscription::SubscriptionBase::SharedPtr> subs;
std::vector<rclcpp::service::ServiceBase::SharedPtr> services;
std::vector<rclcpp::client::ClientBase::SharedPtr> clients;
for (auto & weak_node : weak_nodes_) { for (auto & weak_node : weak_nodes_) {
auto node = weak_node.lock(); auto node = weak_node.lock();
if (!node) { if (!node) {
@ -361,14 +361,14 @@ protected:
for (auto & weak_subscription : group->subscription_ptrs_) { for (auto & weak_subscription : group->subscription_ptrs_) {
auto subscription = weak_subscription.lock(); auto subscription = weak_subscription.lock();
if (subscription) { if (subscription) {
subs.push_back(subscription); memory_strategy_->subs.push_back(subscription);
} }
} }
for (auto & service : group->service_ptrs_) { for (auto & service : group->service_ptrs_) {
services.push_back(service); memory_strategy_->services.push_back(service);
} }
for (auto & client : group->client_ptrs_) { for (auto & client : group->client_ptrs_) {
clients.push_back(client); memory_strategy_->clients.push_back(client);
} }
} }
} }
@ -382,7 +382,7 @@ protected:
})); }));
} }
// Use the number of subscriptions to allocate memory in the handles // Use the number of subscriptions to allocate memory in the handles
size_t max_number_of_subscriptions = subs.size() * 2; // Times two for intra-process. size_t max_number_of_subscriptions = memory_strategy_->subs.size() * 2; // Times two for intra-process.
rmw_subscriptions_t subscriber_handles; rmw_subscriptions_t subscriber_handles;
subscriber_handles.subscriber_count = 0; subscriber_handles.subscriber_count = 0;
// TODO(wjwwood): Avoid redundant malloc's // TODO(wjwwood): Avoid redundant malloc's
@ -395,7 +395,7 @@ protected:
throw std::runtime_error("Could not malloc for subscriber pointers."); throw std::runtime_error("Could not malloc for subscriber pointers.");
} }
// Then fill the SubscriberHandles with ready subscriptions // Then fill the SubscriberHandles with ready subscriptions
for (auto & subscription : subs) { for (auto & subscription : memory_strategy_->subs) {
subscriber_handles.subscribers[subscriber_handles.subscriber_count++] = subscriber_handles.subscribers[subscriber_handles.subscriber_count++] =
subscription->subscription_handle_->data; subscription->subscription_handle_->data;
if (subscription->intra_process_subscription_handle_) { if (subscription->intra_process_subscription_handle_) {
@ -405,7 +405,7 @@ protected:
} }
// Use the number of services to allocate memory in the handles // Use the number of services to allocate memory in the handles
size_t number_of_services = services.size(); size_t number_of_services = memory_strategy_->services.size();
rmw_services_t service_handles; rmw_services_t service_handles;
service_handles.service_count = number_of_services; service_handles.service_count = number_of_services;
service_handles.services = service_handles.services =
@ -418,14 +418,14 @@ protected:
} }
// Then fill the ServiceHandles with ready services // Then fill the ServiceHandles with ready services
size_t service_handle_index = 0; size_t service_handle_index = 0;
for (auto & service : services) { for (auto & service : memory_strategy_->services) {
service_handles.services[service_handle_index] = \ service_handles.services[service_handle_index] = \
service->service_handle_->data; service->service_handle_->data;
service_handle_index += 1; service_handle_index += 1;
} }
// Use the number of clients to allocate memory in the handles // Use the number of clients to allocate memory in the handles
size_t number_of_clients = clients.size(); size_t number_of_clients = memory_strategy_->clients.size();
rmw_clients_t client_handles; rmw_clients_t client_handles;
client_handles.client_count = number_of_clients; client_handles.client_count = number_of_clients;
client_handles.clients = client_handles.clients =
@ -436,7 +436,7 @@ protected:
} }
// Then fill the ServiceHandles with ready clients // Then fill the ServiceHandles with ready clients
size_t client_handle_index = 0; size_t client_handle_index = 0;
for (auto & client : clients) { for (auto & client : memory_strategy_->clients) {
client_handles.clients[client_handle_index] = \ client_handles.clients[client_handle_index] = \
client->client_handle_->data; client->client_handle_->data;
client_handle_index += 1; client_handle_index += 1;
@ -541,6 +541,9 @@ protected:
memory_strategy_->return_handles(HandleType::guard_condition_handle, memory_strategy_->return_handles(HandleType::guard_condition_handle,
guard_condition_handles.guard_conditions); guard_condition_handles.guard_conditions);
memory_strategy_->subs.clear();
memory_strategy_->services.clear();
memory_strategy_->clients.clear();
} }
/******************************/ /******************************/
@ -982,7 +985,6 @@ private:
ServiceHandles service_handles_; ServiceHandles service_handles_;
using ClientHandles = std::list<void *>; using ClientHandles = std::list<void *>;
ClientHandles client_handles_; ClientHandles client_handles_;
}; };
} /* executor */ } /* executor */

View file

@ -97,6 +97,10 @@ public:
{ {
return std::free(ptr); return std::free(ptr);
} }
std::vector<rclcpp::subscription::SubscriptionBase::SharedPtr> subs;
std::vector<rclcpp::service::ServiceBase::SharedPtr> services;
std::vector<rclcpp::client::ClientBase::SharedPtr> clients;
}; };

View file

@ -171,6 +171,10 @@ public:
for (size_t i = 0; i < bounds_.pool_size; ++i) { for (size_t i = 0; i < bounds_.pool_size; ++i) {
memory_map_[memory_pool_[i]] = 0; memory_map_[memory_pool_[i]] = 0;
} }
subs.reserve(bounds_.max_subscriptions);
clients.reserve(bounds_.max_clients);
services.reserve(bounds_.max_services);
} }
/// Default destructor. Free all allocated memory. /// Default destructor. Free all allocated memory.

View file

@ -76,6 +76,9 @@ public:
for (size_t i = 0; i < PoolSize; ++i) { for (size_t i = 0; i < PoolSize; ++i) {
memory_map_[memory_pool_[i]] = 0; memory_map_[memory_pool_[i]] = 0;
} }
subs.reserve(MaxSubscriptions);
clients.reserve(MaxClients);
services.reserve(MaxServices);
} }
void ** borrow_handles(HandleType type, size_t number_of_handles) void ** borrow_handles(HandleType type, size_t number_of_handles)