OpenDDS  Snapshot(2023/04/07-19:43)
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::MultiTask Class Referenceabstract

#include <MultiTask.h>

Inheritance diagram for OpenDDS::DCPS::MultiTask:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::MultiTask:
Collaboration graph
[legend]

Classes

struct  ScheduleDisableCommand
 
struct  ScheduleEnableCommand
 

Public Member Functions

 MultiTask (RcHandle< ReactorInterceptor > interceptor, const TimeDuration &delay)
 
virtual ~MultiTask ()
 
void enable (const TimeDuration &delay)
 
void disable ()
 
virtual void execute (const MonotonicTimePoint &now)=0
 
- Public Member Functions inherited from OpenDDS::DCPS::RcEventHandler
 RcEventHandler ()
 
ACE_Event_Handler::Reference_Count add_reference ()
 
ACE_Event_Handler::Reference_Count remove_reference ()
 
- Public Member Functions inherited from ACE_Event_Handler
virtual ~ACE_Event_Handler (void)
 
virtual ACE_HANDLE get_handle (void) const
 
virtual void set_handle (ACE_HANDLE)
 
virtual int priority (void) const
 
virtual void priority (int priority)
 
virtual int handle_input (ACE_HANDLE fd=ACE_INVALID_HANDLE)
 
virtual int handle_output (ACE_HANDLE fd=ACE_INVALID_HANDLE)
 
virtual int handle_exception (ACE_HANDLE fd=ACE_INVALID_HANDLE)
 
virtual int handle_exit (ACE_Process *)
 
virtual int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
 
virtual int handle_signal (int signum, siginfo_t *=0, ucontext_t *=0)
 
virtual int resume_handler (void)
 
virtual int handle_qos (ACE_HANDLE=ACE_INVALID_HANDLE)
 
virtual int handle_group_qos (ACE_HANDLE=ACE_INVALID_HANDLE)
 
virtual void reactor (ACE_Reactor *reactor)
 
virtual ACE_Reactorreactor (void) const
 
virtual ACE_Reactor_Timer_Interfacereactor_timer_interface (void) const
 
Reference_Counting_Policyreference_counting_policy (void)
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Private Member Functions

int handle_timeout (const ACE_Time_Value &tv, const void *)
 
void enable_i (const TimeDuration &per)
 
void disable_i ()
 

Private Attributes

WeakRcHandle< ReactorInterceptorinterceptor_
 
const TimeDuration delay_
 
long timer_
 
MonotonicTimePoint next_time_
 
TimeDuration cancel_estimate_
 
ACE_Thread_Mutex mutex_
 

Additional Inherited Members

- Public Types inherited from ACE_Event_Handler
typedef long Reference_Count
 
- Static Public Member Functions inherited from ACE_Event_Handler
static ACE_THR_FUNC_RETURN read_adapter (void *event_handler)
 
static int register_stdin_handler (ACE_Event_Handler *eh, ACE_Reactor *reactor, ACE_Thread_Manager *thr_mgr, int flags=THR_DETACHED)
 
static int remove_stdin_handler (ACE_Reactor *reactor, ACE_Thread_Manager *thr_mgr)
 
- Public Attributes inherited from ACE_Event_Handler
 LO_PRIORITY
 
 HI_PRIORITY
 
 NULL_MASK
 
 READ_MASK
 
 WRITE_MASK
 
 EXCEPT_MASK
 
 ACCEPT_MASK
 
 CONNECT_MASK
 
 TIMER_MASK
 
 QOS_MASK
 
 GROUP_QOS_MASK
 
 SIGNAL_MASK
 
 ALL_EVENTS_MASK
 
 RWE_MASK
 
 DONT_CALL
 
 ACE_EVENT_HANDLER_NOT_RESUMED
 
 ACE_REACTOR_RESUMES_HANDLER
 
 ACE_APPLICATION_RESUMES_HANDLER
 
- Protected Types inherited from ACE_Event_Handler
typedef ACE_Atomic_Op< ACE_SYNCH_MUTEX, Reference_CountAtomic_Reference_Count
 
- Protected Member Functions inherited from ACE_Event_Handler
 ACE_Event_Handler (ACE_Reactor *=0, int priority=ACE_Event_Handler::LO_PRIORITY)
 
- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 
- Protected Attributes inherited from ACE_Event_Handler
Atomic_Reference_Count reference_count_
 

Detailed Description

Definition at line 21 of file MultiTask.h.

Constructor & Destructor Documentation

◆ MultiTask()

OpenDDS::DCPS::MultiTask::MultiTask ( RcHandle< ReactorInterceptor interceptor,
const TimeDuration delay 
)
inlineexplicit

Definition at line 23 of file MultiTask.h.

References ACE_Event_Handler::reactor(), and OpenDDS::DCPS::ReactorInterceptor::reactor().

24  : interceptor_(interceptor)
25  , delay_(delay)
26  , timer_(-1)
27  , next_time_()
29  {
30  reactor(interceptor->reactor());
31  }
MonotonicTimePoint next_time_
Definition: MultiTask.h:64
TimeDuration cancel_estimate_
Definition: MultiTask.h:65
virtual ACE_Reactor * reactor(void) const
WeakRcHandle< ReactorInterceptor > interceptor_
Definition: MultiTask.h:61
virtual void reactor(ACE_Reactor *reactor)
const TimeDuration delay_
Definition: MultiTask.h:62

◆ ~MultiTask()

virtual OpenDDS::DCPS::MultiTask::~MultiTask ( )
inlinevirtual

Definition at line 33 of file MultiTask.h.

33 {}

Member Function Documentation

◆ disable()

void OpenDDS::DCPS::MultiTask::disable ( )
inline

Definition at line 50 of file MultiTask.h.

References execute(), OpenDDS::DCPS::ReactorInterceptor::execute_or_enqueue(), interceptor_, and OpenDDS::DCPS::rchandle_from().

51  {
52  RcHandle<ReactorInterceptor> interceptor = interceptor_.lock();
53  if (interceptor) {
54  interceptor->execute_or_enqueue(make_rch<ScheduleDisableCommand>(rchandle_from(this)));
55  }
56  }
WeakRcHandle< ReactorInterceptor > interceptor_
Definition: MultiTask.h:61
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310

◆ disable_i()

void OpenDDS::DCPS::MultiTask::disable_i ( )
inlineprivate

Definition at line 146 of file MultiTask.h.

References ACE_Reactor::cancel_timer(), and OpenDDS::DCPS::ReactorInterceptor::Command::reactor().

147  {
149  if (timer_ != -1) {
151  timer_ = -1;
152  }
153  }
ACE_Thread_Mutex mutex_
Definition: MultiTask.h:66
virtual ACE_Reactor * reactor(void) const
virtual int cancel_timer(long timer_id, const void **arg=0, int dont_call_handle_close=1)

◆ enable()

void OpenDDS::DCPS::MultiTask::enable ( const TimeDuration delay)
inline

Definition at line 35 of file MultiTask.h.

References cancel_estimate_, OpenDDS::DCPS::ReactorInterceptor::execute_or_enqueue(), interceptor_, mutex_, next_time_, OpenDDS::DCPS::TimePoint_T< MonotonicClock >::now(), OpenDDS::DCPS::rchandle_from(), and timer_.

36  {
37  bool worth_passing_along = false;
38  {
40  worth_passing_along = (timer_ == -1) || ((MonotonicTimePoint::now() + delay + cancel_estimate_) < next_time_);
41  }
42  if (worth_passing_along) {
43  RcHandle<ReactorInterceptor> interceptor = interceptor_.lock();
44  if (interceptor) {
45  interceptor->execute_or_enqueue(make_rch<ScheduleEnableCommand>(rchandle_from(this), delay));
46  }
47  }
48  }
ACE_Thread_Mutex mutex_
Definition: MultiTask.h:66
static TimePoint_T< MonotonicClock > now()
Definition: TimePoint_T.inl:41
MonotonicTimePoint next_time_
Definition: MultiTask.h:64
TimeDuration cancel_estimate_
Definition: MultiTask.h:65
WeakRcHandle< ReactorInterceptor > interceptor_
Definition: MultiTask.h:61
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310

◆ enable_i()

void OpenDDS::DCPS::MultiTask::enable_i ( const TimeDuration per)
inlineprivate

Definition at line 114 of file MultiTask.h.

References ACE_ERROR, ACE_TEXT(), cancel_estimate_, ACE_Reactor::cancel_timer(), LM_ERROR, OpenDDS::DCPS::TimePoint_T< MonotonicClock >::now(), OpenDDS::DCPS::ReactorInterceptor::Command::reactor(), ACE_Reactor::schedule_timer(), and OpenDDS::DCPS::TimeDuration::value().

115  {
118  if (timer_ == -1) {
119  timer_ = reactor()->schedule_timer(this, 0, per.value(), delay_.value());
120 
121  if (timer_ == -1) {
122  ACE_ERROR((LM_ERROR, "(%P|%t) MultiTask::enable"
123  " failed to schedule timer %p\n", ACE_TEXT("")));
124  } else {
125  next_time_ = now + per;
126  }
127  } else {
128  const MonotonicTimePoint estimated_next_time = now + per + cancel_estimate_;
129  if (estimated_next_time < next_time_) {
132  timer_ = reactor()->schedule_timer(this, 0, per.value(), delay_.value());
133  cancel_estimate_ = now2 - now;
134 
135  if (timer_ == -1) {
136  ACE_ERROR((LM_ERROR, "(%P|%t) MultiTask::enable"
137  " failed to reschedule timer %p\n", ACE_TEXT("")));
138  } else {
139  next_time_ = now2 + per;
140  }
141  }
142  }
143  }
#define ACE_ERROR(X)
ACE_Thread_Mutex mutex_
Definition: MultiTask.h:66
static TimePoint_T< MonotonicClock > now()
Definition: TimePoint_T.inl:41
const ACE_Time_Value & value() const
MonotonicTimePoint next_time_
Definition: MultiTask.h:64
virtual long schedule_timer(ACE_Event_Handler *event_handler, const void *arg, const ACE_Time_Value &delay, const ACE_Time_Value &interval=ACE_Time_Value::zero)
TimeDuration cancel_estimate_
Definition: MultiTask.h:65
virtual ACE_Reactor * reactor(void) const
TimePoint_T< MonotonicClock > MonotonicTimePoint
Definition: TimeTypes.h:51
ACE_TEXT("TCP_Factory")
const TimeDuration delay_
Definition: MultiTask.h:62
virtual int cancel_timer(long timer_id, const void **arg=0, int dont_call_handle_close=1)

◆ execute()

virtual void OpenDDS::DCPS::MultiTask::execute ( const MonotonicTimePoint now)
pure virtual

Implemented in OpenDDS::DCPS::PmfMultiTask< Delegate >.

Referenced by disable().

◆ handle_timeout()

int OpenDDS::DCPS::MultiTask::handle_timeout ( const ACE_Time_Value tv,
const void *   
)
inlineprivatevirtual

Reimplemented from ACE_Event_Handler.

Definition at line 101 of file MultiTask.h.

References OpenDDS::DCPS::MultiTask::ScheduleEnableCommand::delay_, OpenDDS::DCPS::MultiTask::ScheduleEnableCommand::execute(), and TheServiceParticipant.

102  {
103  ThreadStatusManager::Event ev(TheServiceParticipant->get_thread_status_manager());
104 
105  const MonotonicTimePoint now(tv);
106  {
108  next_time_ = now + delay_;
109  }
110  execute(now);
111  return 0;
112  }
ACE_Thread_Mutex mutex_
Definition: MultiTask.h:66
MonotonicTimePoint next_time_
Definition: MultiTask.h:64
virtual void execute(const MonotonicTimePoint &now)=0
TimePoint_T< MonotonicClock > MonotonicTimePoint
Definition: TimeTypes.h:51
const TimeDuration delay_
Definition: MultiTask.h:62
#define TheServiceParticipant

Member Data Documentation

◆ cancel_estimate_

TimeDuration OpenDDS::DCPS::MultiTask::cancel_estimate_
private

Definition at line 65 of file MultiTask.h.

Referenced by enable(), and enable_i().

◆ delay_

const TimeDuration OpenDDS::DCPS::MultiTask::delay_
private

Definition at line 62 of file MultiTask.h.

◆ interceptor_

WeakRcHandle<ReactorInterceptor> OpenDDS::DCPS::MultiTask::interceptor_
private

Definition at line 61 of file MultiTask.h.

Referenced by disable(), and enable().

◆ mutex_

ACE_Thread_Mutex OpenDDS::DCPS::MultiTask::mutex_
mutableprivate

Definition at line 66 of file MultiTask.h.

Referenced by enable().

◆ next_time_

MonotonicTimePoint OpenDDS::DCPS::MultiTask::next_time_
private

Definition at line 64 of file MultiTask.h.

Referenced by enable().

◆ timer_

long OpenDDS::DCPS::MultiTask::timer_
private

Definition at line 63 of file MultiTask.h.

Referenced by enable().


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