OpenDDS  Snapshot(2023/04/07-19:43)
Public Member Functions | Protected Attributes | List of all members
OpenDDS::DCPS::ConditionVariable< Mutex > Class Template Reference

#include <ConditionVariable.h>

Collaboration diagram for OpenDDS::DCPS::ConditionVariable< Mutex >:
Collaboration graph
[legend]

Public Member Functions

 ConditionVariable (Mutex &mutex)
 
CvStatus wait (ThreadStatusManager &thread_status_manager)
 Block until thread is woken up. More...
 
CvStatus wait_until (const MonotonicTimePoint &expire_at, ThreadStatusManager &thread_status_manager)
 Block until woken up or until expire_at. Same as wait() if expire_at is zero. More...
 
CvStatus wait_for (const TimeDuration &expire_in, ThreadStatusManager &thread_status_manager)
 Block until woken up or for expire_in. Same as wait() if expire_in is zero. More...
 
bool notify_one ()
 Unblock one of the threads waiting on this condition. More...
 
bool notify_all ()
 Unblock all of the threads waiting on this condition. More...
 

Protected Attributes

ACE_Condition< Muteximpl_
 

Detailed Description

template<typename Mutex>
class OpenDDS::DCPS::ConditionVariable< Mutex >

ACE_Condition wrapper based on std::condition_variable that enforces monotonic time behavior.

Besides the fact that it only works with ACE Mutexes, the major difference between this and std::condition_variable_any, the generalized form of std::condition_variable, is that it takes the mutex as a constructor argument, where the std::condition_variables take them as method arguments.

Definition at line 45 of file ConditionVariable.h.

Constructor & Destructor Documentation

◆ ConditionVariable()

template<typename Mutex>
OpenDDS::DCPS::ConditionVariable< Mutex >::ConditionVariable ( Mutex mutex)
inlineexplicit

Definition at line 47 of file ConditionVariable.h.

Member Function Documentation

◆ notify_all()

template<typename Mutex>
bool OpenDDS::DCPS::ConditionVariable< Mutex >::notify_all ( )
inline

Unblock all of the threads waiting on this condition.

Definition at line 106 of file ConditionVariable.h.

Referenced by OpenDDS::DCPS::DataReaderImpl::add_association(), OpenDDS::DCPS::DomainParticipantImpl::assign_handle(), OpenDDS::DCPS::DispatchService::cancel(), OpenDDS::DCPS::ThreadPerConnectionSendTask::close(), OpenDDS::DCPS::ReplayerImpl::data_delivered(), OpenDDS::DCPS::WriteDataContainer::data_delivered(), OpenDDS::DCPS::ReplayerImpl::data_dropped(), OpenDDS::DCPS::WriteDataContainer::data_dropped(), OpenDDS::DCPS::TypeObjReqCond::done(), OpenDDS::DCPS::DataReaderImpl::enable(), OpenDDS::DCPS::DomainParticipantImpl::handle_exception(), OpenDDS::DCPS::MessageTracker::message_delivered(), OpenDDS::DCPS::MessageTracker::message_dropped(), OpenDDS::DCPS::ReactorTask::open_reactor_task(), OpenDDS::DCPS::WriteDataContainer::remove_oldest_sample(), OpenDDS::DCPS::WriteDataContainer::remove_reader_acks(), OpenDDS::DCPS::ThreadPool::run(), OpenDDS::DCPS::DispatchService::run_event_loop(), OpenDDS::DCPS::DispatchService::shutdown(), OpenDDS::DCPS::ReactorTask::svc(), OpenDDS::DCPS::WriteDataContainer::unregister_all(), OpenDDS::DCPS::WriteDataContainer::update_acked(), and OpenDDS::DCPS::WriteDataContainer::wakeup_blocking_writers().

107  {
108  if (impl_.broadcast() == 0) {
109  return true;
110  }
111  if (DCPS_debug_level) {
112  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: ConditionVariable::notify_all: %m\n"));
113  }
114  return false;
115  }
#define ACE_ERROR(X)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
int broadcast(void)

◆ notify_one()

template<typename Mutex>
bool OpenDDS::DCPS::ConditionVariable< Mutex >::notify_one ( )
inline

◆ wait()

template<typename Mutex>
CvStatus OpenDDS::DCPS::ConditionVariable< Mutex >::wait ( ThreadStatusManager thread_status_manager)
inline

Block until thread is woken up.

Definition at line 53 of file ConditionVariable.h.

Referenced by OpenDDS::DCPS::DomainParticipantImpl::await_handle(), OpenDDS::DCPS::ReplayerImpl::cleanup(), OpenDDS::DCPS::DomainParticipantImpl::delete_contained_entities(), OpenDDS::DCPS::ThreadPool::join_all(), OpenDDS::DCPS::ReactorTask::open_reactor_task(), TAO_DDS_DCPSInfo_i::remove_domain_participant(), OpenDDS::DCPS::ThreadPool::run(), OpenDDS::DCPS::DispatchService::run_event_loop(), OpenDDS::DCPS::DispatchService::shutdown(), OpenDDS::RTPS::Spdp::shutdown(), OpenDDS::DCPS::DcpsUpcalls::svc(), OpenDDS::DCPS::PerConnectionSynch::svc(), OpenDDS::DCPS::ThreadPerConnectionSendTask::svc(), OpenDDS::DCPS::QueueTaskBase< DataLink_rch >::svc(), OpenDDS::DCPS::ThreadPool::ThreadPool(), OpenDDS::DCPS::TypeObjReqCond::wait(), DDS::WaitSet::wait(), OpenDDS::DCPS::WriteDataContainer::wait_ack_of_seq(), OpenDDS::DCPS::ConditionVariable< ACE_Thread_Mutex >::wait_for(), OpenDDS::DCPS::ReactorTask::wait_for_startup_i(), and OpenDDS::DCPS::ConditionVariable< ACE_Thread_Mutex >::wait_until().

54  {
55  ThreadStatusManager::Sleeper s(thread_status_manager);
56  if (impl_.wait() == 0) {
57  return CvStatus_NoTimeout;
58  }
59  if (DCPS_debug_level) {
60  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: ConditionVariable::wait: %p\n"));
61  }
62  return CvStatus_Error;
63  }
#define ACE_ERROR(X)
int wait(const ACE_Time_Value *abstime)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
The wait has returned because it was woken up.

◆ wait_for()

template<typename Mutex>
CvStatus OpenDDS::DCPS::ConditionVariable< Mutex >::wait_for ( const TimeDuration expire_in,
ThreadStatusManager thread_status_manager 
)
inline

Block until woken up or for expire_in. Same as wait() if expire_in is zero.

Definition at line 84 of file ConditionVariable.h.

85  {
86  if (expire_in.is_zero()) {
87  return wait(thread_status_manager);
88  }
89  ThreadStatusManager::Sleeper s(thread_status_manager);
90  return wait_until(MonotonicTimePoint::now() + expire_in);
91  }
static TimePoint_T< MonotonicClock > now()
Definition: TimePoint_T.inl:41
CvStatus wait(ThreadStatusManager &thread_status_manager)
Block until thread is woken up.
CvStatus wait_until(const MonotonicTimePoint &expire_at, ThreadStatusManager &thread_status_manager)
Block until woken up or until expire_at. Same as wait() if expire_at is zero.

◆ wait_until()

template<typename Mutex>
CvStatus OpenDDS::DCPS::ConditionVariable< Mutex >::wait_until ( const MonotonicTimePoint expire_at,
ThreadStatusManager thread_status_manager 
)
inline

Block until woken up or until expire_at. Same as wait() if expire_at is zero.

Definition at line 66 of file ConditionVariable.h.

Referenced by OpenDDS::DCPS::DomainParticipantImpl::await_handle(), OpenDDS::DCPS::WriteDataContainer::obtain_buffer(), OpenDDS::DCPS::DispatchService::run_event_loop(), OpenDDS::DCPS::DcpsUpcalls::svc(), OpenDDS::DCPS::QueueTaskBase< DataLink_rch >::svc(), DDS::WaitSet::wait(), OpenDDS::DCPS::WriteDataContainer::wait_ack_of_seq(), OpenDDS::DCPS::ConditionVariable< ACE_Thread_Mutex >::wait_for(), OpenDDS::DCPS::MessageTracker::wait_messages_pending(), and OpenDDS::DCPS::WriteDataContainer::wait_pending().

67  {
68  if (expire_at.is_zero()) {
69  return wait(thread_status_manager);
70  }
71  ThreadStatusManager::Sleeper s(thread_status_manager);
72  if (impl_.wait(&expire_at.value()) == 0) {
73  return CvStatus_NoTimeout;
74  } else if (errno == ETIME) {
75  return CvStatus_Timeout;
76  }
77  if (DCPS_debug_level) {
78  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: ConditionVariable::wait_until: %m\n"));
79  }
80  return CvStatus_Error;
81  }
#define ACE_ERROR(X)
int wait(const ACE_Time_Value *abstime)
The wait has returned because of a timeout.
CvStatus wait(ThreadStatusManager &thread_status_manager)
Block until thread is woken up.
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
The wait has returned because it was woken up.

Member Data Documentation

◆ impl_

template<typename Mutex>
ACE_Condition<Mutex> OpenDDS::DCPS::ConditionVariable< Mutex >::impl_
protected

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