Merge pull request #223 from ros2/mutex_callbackgroup

Add mutex to protect vectors of pointers in callbackgroup
This commit is contained in:
gerkey 2016-06-06 17:36:25 -07:00
commit 3c45a571e7
2 changed files with 11 additions and 0 deletions

View file

@ -16,6 +16,7 @@
#define RCLCPP__CALLBACK_GROUP_HPP_ #define RCLCPP__CALLBACK_GROUP_HPP_
#include <atomic> #include <atomic>
#include <mutex>
#include <string> #include <string>
#include <vector> #include <vector>
@ -97,6 +98,8 @@ private:
add_client(const rclcpp::client::ClientBase::SharedPtr client_ptr); add_client(const rclcpp::client::ClientBase::SharedPtr client_ptr);
CallbackGroupType type_; CallbackGroupType type_;
// Mutex to protect the subsequent vectors of pointers.
mutable std::mutex mutex_;
std::vector<rclcpp::subscription::SubscriptionBase::WeakPtr> subscription_ptrs_; std::vector<rclcpp::subscription::SubscriptionBase::WeakPtr> subscription_ptrs_;
std::vector<rclcpp::timer::TimerBase::WeakPtr> timer_ptrs_; std::vector<rclcpp::timer::TimerBase::WeakPtr> timer_ptrs_;
std::vector<rclcpp::service::ServiceBase::SharedPtr> service_ptrs_; std::vector<rclcpp::service::ServiceBase::SharedPtr> service_ptrs_;

View file

@ -26,24 +26,28 @@ CallbackGroup::CallbackGroup(CallbackGroupType group_type)
const std::vector<rclcpp::subscription::SubscriptionBase::WeakPtr> & const std::vector<rclcpp::subscription::SubscriptionBase::WeakPtr> &
CallbackGroup::get_subscription_ptrs() const CallbackGroup::get_subscription_ptrs() const
{ {
std::lock_guard<std::mutex> lock(mutex_);
return subscription_ptrs_; return subscription_ptrs_;
} }
const std::vector<rclcpp::timer::TimerBase::WeakPtr> & const std::vector<rclcpp::timer::TimerBase::WeakPtr> &
CallbackGroup::get_timer_ptrs() const CallbackGroup::get_timer_ptrs() const
{ {
std::lock_guard<std::mutex> lock(mutex_);
return timer_ptrs_; return timer_ptrs_;
} }
const std::vector<rclcpp::service::ServiceBase::SharedPtr> & const std::vector<rclcpp::service::ServiceBase::SharedPtr> &
CallbackGroup::get_service_ptrs() const CallbackGroup::get_service_ptrs() const
{ {
std::lock_guard<std::mutex> lock(mutex_);
return service_ptrs_; return service_ptrs_;
} }
const std::vector<rclcpp::client::ClientBase::WeakPtr> & const std::vector<rclcpp::client::ClientBase::WeakPtr> &
CallbackGroup::get_client_ptrs() const CallbackGroup::get_client_ptrs() const
{ {
std::lock_guard<std::mutex> lock(mutex_);
return client_ptrs_; return client_ptrs_;
} }
@ -63,23 +67,27 @@ void
CallbackGroup::add_subscription( CallbackGroup::add_subscription(
const rclcpp::subscription::SubscriptionBase::SharedPtr subscription_ptr) const rclcpp::subscription::SubscriptionBase::SharedPtr subscription_ptr)
{ {
std::lock_guard<std::mutex> lock(mutex_);
subscription_ptrs_.push_back(subscription_ptr); subscription_ptrs_.push_back(subscription_ptr);
} }
void void
CallbackGroup::add_timer(const rclcpp::timer::TimerBase::SharedPtr timer_ptr) CallbackGroup::add_timer(const rclcpp::timer::TimerBase::SharedPtr timer_ptr)
{ {
std::lock_guard<std::mutex> lock(mutex_);
timer_ptrs_.push_back(timer_ptr); timer_ptrs_.push_back(timer_ptr);
} }
void void
CallbackGroup::add_service(const rclcpp::service::ServiceBase::SharedPtr service_ptr) CallbackGroup::add_service(const rclcpp::service::ServiceBase::SharedPtr service_ptr)
{ {
std::lock_guard<std::mutex> lock(mutex_);
service_ptrs_.push_back(service_ptr); service_ptrs_.push_back(service_ptr);
} }
void void
CallbackGroup::add_client(const rclcpp::client::ClientBase::SharedPtr client_ptr) CallbackGroup::add_client(const rclcpp::client::ClientBase::SharedPtr client_ptr)
{ {
std::lock_guard<std::mutex> lock(mutex_);
client_ptrs_.push_back(client_ptr); client_ptrs_.push_back(client_ptr);
} }