rclcpp  master
C++ ROS Client Library API
Protected Member Functions | Protected Attributes | List of all members
rclcpp::wait_set_policies::ThreadSafeSynchronization Class Reference

WaitSet policy that provides thread-safe synchronization for the wait set. More...

#include <thread_safe_synchronization.hpp>

Inheritance diagram for rclcpp::wait_set_policies::ThreadSafeSynchronization:
Inheritance graph
[legend]
Collaboration diagram for rclcpp::wait_set_policies::ThreadSafeSynchronization:
Collaboration graph
[legend]

Protected Member Functions

 ThreadSafeSynchronization (rclcpp::Context::SharedPtr context)
 
 ~ThreadSafeSynchronization ()=default
 
const std::array< std::shared_ptr< rclcpp::GuardCondition >, 1 > & get_extra_guard_conditions ()
 Return any "extra" guard conditions needed to implement the synchronization policy. More...
 
void interrupt_waiting_wait_set ()
 Interrupt any waiting wait set. More...
 
void sync_add_subscription (std::shared_ptr< rclcpp::SubscriptionBase > &&subscription, const rclcpp::SubscriptionWaitSetMask &mask, std::function< void(std::shared_ptr< rclcpp::SubscriptionBase > &&, const rclcpp::SubscriptionWaitSetMask &) > add_subscription_function)
 Add subscription. More...
 
void sync_remove_subscription (std::shared_ptr< rclcpp::SubscriptionBase > &&subscription, const rclcpp::SubscriptionWaitSetMask &mask, std::function< void(std::shared_ptr< rclcpp::SubscriptionBase > &&, const rclcpp::SubscriptionWaitSetMask &) > remove_subscription_function)
 Remove guard condition. More...
 
void sync_add_guard_condition (std::shared_ptr< rclcpp::GuardCondition > &&guard_condition, std::function< void(std::shared_ptr< rclcpp::GuardCondition > &&)> add_guard_condition_function)
 Add guard condition. More...
 
void sync_remove_guard_condition (std::shared_ptr< rclcpp::GuardCondition > &&guard_condition, std::function< void(std::shared_ptr< rclcpp::GuardCondition > &&)> remove_guard_condition_function)
 Remove guard condition. More...
 
void sync_add_timer (std::shared_ptr< rclcpp::TimerBase > &&timer, std::function< void(std::shared_ptr< rclcpp::TimerBase > &&)> add_timer_function)
 Add timer. More...
 
void sync_remove_timer (std::shared_ptr< rclcpp::TimerBase > &&timer, std::function< void(std::shared_ptr< rclcpp::TimerBase > &&)> remove_timer_function)
 Remove timer. More...
 
void sync_add_client (std::shared_ptr< rclcpp::ClientBase > &&client, std::function< void(std::shared_ptr< rclcpp::ClientBase > &&)> add_client_function)
 Add client. More...
 
void sync_remove_client (std::shared_ptr< rclcpp::ClientBase > &&client, std::function< void(std::shared_ptr< rclcpp::ClientBase > &&)> remove_client_function)
 Remove client. More...
 
void sync_add_service (std::shared_ptr< rclcpp::ServiceBase > &&service, std::function< void(std::shared_ptr< rclcpp::ServiceBase > &&)> add_service_function)
 Add service. More...
 
void sync_remove_service (std::shared_ptr< rclcpp::ServiceBase > &&service, std::function< void(std::shared_ptr< rclcpp::ServiceBase > &&)> remove_service_function)
 Remove service. More...
 
void sync_add_waitable (std::shared_ptr< rclcpp::Waitable > &&waitable, std::shared_ptr< void > &&associated_entity, std::function< void(std::shared_ptr< rclcpp::Waitable > &&, std::shared_ptr< void > &&) > add_waitable_function)
 Add waitable. More...
 
void sync_remove_waitable (std::shared_ptr< rclcpp::Waitable > &&waitable, std::function< void(std::shared_ptr< rclcpp::Waitable > &&)> remove_waitable_function)
 Remove waitable. More...
 
void sync_prune_deleted_entities (std::function< void()> prune_deleted_entities_function)
 Prune deleted entities. More...
 
template<class WaitResultT >
WaitResultT sync_wait (std::chrono::nanoseconds time_to_wait_ns, std::function< void()> rebuild_rcl_wait_set, std::function< rcl_wait_set_t &()> get_rcl_wait_set, std::function< WaitResultT(WaitResultKind wait_result_kind)> create_wait_result)
 Implements wait. More...
 
void sync_wait_result_acquire ()
 
void sync_wait_result_release ()
 
- Protected Member Functions inherited from rclcpp::wait_set_policies::detail::SynchronizationPolicyCommon
 SynchronizationPolicyCommon ()=default
 
 ~SynchronizationPolicyCommon ()=default
 
std::function< bool()> create_loop_predicate (std::chrono::nanoseconds time_to_wait_ns, std::chrono::steady_clock::time_point start)
 
std::chrono::nanoseconds calculate_time_left_to_wait (std::chrono::nanoseconds original_time_to_wait_ns, std::chrono::steady_clock::time_point start)
 

Protected Attributes

std::array< std::shared_ptr< rclcpp::GuardCondition >, 1 > extra_guard_conditions_
 
rclcpp::wait_set_policies::detail::WritePreferringReadWriteLock wprw_lock_
 

Detailed Description

WaitSet policy that provides thread-safe synchronization for the wait set.

This class uses a "write-preferring RW lock" so that adding items to, and removing items from, the wait set will take priority over reading, i.e. waiting. This is done since add and remove calls will interrupt the wait set anyways so it is wasteful to do "fair" locking when there are many add/remove operations queued up.

There are some things to consider about the thread-safety provided by this policy. There are two categories of activities, reading and writing activities. The writing activities include all of the add and remove methods, as well as the prune_deleted_entities() method. The reading methods include the wait() method and keeping a WaitResult in scope. The reading and writing activities will not be run at the same time, and one will block the other. Therefore, if you are holding a WaitResult in scope, and try to add or remove an entity at the same time, they will block each other. The write activities will try to interrupt the wait() method by triggering a guard condition, but they have no way of causing the WaitResult to release its lock.

Constructor & Destructor Documentation

◆ ThreadSafeSynchronization()

rclcpp::wait_set_policies::ThreadSafeSynchronization::ThreadSafeSynchronization ( rclcpp::Context::SharedPtr  context)
inlineexplicitprotected

◆ ~ThreadSafeSynchronization()

rclcpp::wait_set_policies::ThreadSafeSynchronization::~ThreadSafeSynchronization ( )
protecteddefault

Member Function Documentation

◆ get_extra_guard_conditions()

const std::array<std::shared_ptr<rclcpp::GuardCondition>, 1>& rclcpp::wait_set_policies::ThreadSafeSynchronization::get_extra_guard_conditions ( )
inlineprotected

Return any "extra" guard conditions needed to implement the synchronization policy.

This policy has one guard condition which is used to interrupt the wait set when adding and removing entities.

◆ interrupt_waiting_wait_set()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::interrupt_waiting_wait_set ( )
inlineprotected

Interrupt any waiting wait set.

Used to interrupt the wait set when adding or removing items.

◆ sync_add_subscription()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_subscription ( std::shared_ptr< rclcpp::SubscriptionBase > &&  subscription,
const rclcpp::SubscriptionWaitSetMask mask,
std::function< void(std::shared_ptr< rclcpp::SubscriptionBase > &&, const rclcpp::SubscriptionWaitSetMask &) >  add_subscription_function 
)
inlineprotected

Add subscription.

◆ sync_remove_subscription()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_subscription ( std::shared_ptr< rclcpp::SubscriptionBase > &&  subscription,
const rclcpp::SubscriptionWaitSetMask mask,
std::function< void(std::shared_ptr< rclcpp::SubscriptionBase > &&, const rclcpp::SubscriptionWaitSetMask &) >  remove_subscription_function 
)
inlineprotected

Remove guard condition.

◆ sync_add_guard_condition()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_guard_condition ( std::shared_ptr< rclcpp::GuardCondition > &&  guard_condition,
std::function< void(std::shared_ptr< rclcpp::GuardCondition > &&)>  add_guard_condition_function 
)
inlineprotected

Add guard condition.

◆ sync_remove_guard_condition()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_guard_condition ( std::shared_ptr< rclcpp::GuardCondition > &&  guard_condition,
std::function< void(std::shared_ptr< rclcpp::GuardCondition > &&)>  remove_guard_condition_function 
)
inlineprotected

Remove guard condition.

◆ sync_add_timer()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_timer ( std::shared_ptr< rclcpp::TimerBase > &&  timer,
std::function< void(std::shared_ptr< rclcpp::TimerBase > &&)>  add_timer_function 
)
inlineprotected

Add timer.

◆ sync_remove_timer()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_timer ( std::shared_ptr< rclcpp::TimerBase > &&  timer,
std::function< void(std::shared_ptr< rclcpp::TimerBase > &&)>  remove_timer_function 
)
inlineprotected

Remove timer.

◆ sync_add_client()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_client ( std::shared_ptr< rclcpp::ClientBase > &&  client,
std::function< void(std::shared_ptr< rclcpp::ClientBase > &&)>  add_client_function 
)
inlineprotected

Add client.

◆ sync_remove_client()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_client ( std::shared_ptr< rclcpp::ClientBase > &&  client,
std::function< void(std::shared_ptr< rclcpp::ClientBase > &&)>  remove_client_function 
)
inlineprotected

Remove client.

◆ sync_add_service()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_service ( std::shared_ptr< rclcpp::ServiceBase > &&  service,
std::function< void(std::shared_ptr< rclcpp::ServiceBase > &&)>  add_service_function 
)
inlineprotected

Add service.

◆ sync_remove_service()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_service ( std::shared_ptr< rclcpp::ServiceBase > &&  service,
std::function< void(std::shared_ptr< rclcpp::ServiceBase > &&)>  remove_service_function 
)
inlineprotected

Remove service.

◆ sync_add_waitable()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_add_waitable ( std::shared_ptr< rclcpp::Waitable > &&  waitable,
std::shared_ptr< void > &&  associated_entity,
std::function< void(std::shared_ptr< rclcpp::Waitable > &&, std::shared_ptr< void > &&) >  add_waitable_function 
)
inlineprotected

Add waitable.

◆ sync_remove_waitable()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_remove_waitable ( std::shared_ptr< rclcpp::Waitable > &&  waitable,
std::function< void(std::shared_ptr< rclcpp::Waitable > &&)>  remove_waitable_function 
)
inlineprotected

Remove waitable.

◆ sync_prune_deleted_entities()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_prune_deleted_entities ( std::function< void()>  prune_deleted_entities_function)
inlineprotected

Prune deleted entities.

◆ sync_wait()

template<class WaitResultT >
WaitResultT rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_wait ( std::chrono::nanoseconds  time_to_wait_ns,
std::function< void()>  rebuild_rcl_wait_set,
std::function< rcl_wait_set_t &()>  get_rcl_wait_set,
std::function< WaitResultT(WaitResultKind wait_result_kind)>  create_wait_result 
)
inlineprotected

Implements wait.

◆ sync_wait_result_acquire()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_wait_result_acquire ( )
inlineprotected

◆ sync_wait_result_release()

void rclcpp::wait_set_policies::ThreadSafeSynchronization::sync_wait_result_release ( )
inlineprotected

Member Data Documentation

◆ extra_guard_conditions_

std::array<std::shared_ptr<rclcpp::GuardCondition>, 1> rclcpp::wait_set_policies::ThreadSafeSynchronization::extra_guard_conditions_
protected

◆ wprw_lock_

rclcpp::wait_set_policies::detail::WritePreferringReadWriteLock rclcpp::wait_set_policies::ThreadSafeSynchronization::wprw_lock_
protected

The documentation for this class was generated from the following file: