#include <EC_Sched_Filter.h>
Inheritance diagram for TAO_EC_Sched_Filter:
Public Member Functions | |
TAO_EC_Sched_Filter (const char *name, RtecScheduler::handle_t rt_info, RtecScheduler::Scheduler_ptr scheduler, TAO_EC_Filter *body, RtecScheduler::handle_t body_info, RtecScheduler::handle_t parent_info, RtecScheduler::Info_Type_t info_type) | |
virtual | ~TAO_EC_Sched_Filter (void) |
Destructor. | |
virtual ChildrenIterator | begin (void) const |
virtual ChildrenIterator | end (void) const |
virtual int | size (void) const |
virtual int | filter (const RtecEventComm::EventSet &event, TAO_EC_QOS_Info &qos_info) |
virtual int | filter_nocopy (RtecEventComm::EventSet &event, TAO_EC_QOS_Info &qos_info) |
virtual void | push (const RtecEventComm::EventSet &event, TAO_EC_QOS_Info &qos_info) |
virtual void | push_nocopy (RtecEventComm::EventSet &event, TAO_EC_QOS_Info &qos_info) |
virtual void | clear (void) |
virtual CORBA::ULong | max_event_size (void) const |
Returns the maximum size of the events pushed by this filter. | |
virtual int | can_match (const RtecEventComm::EventHeader &header) const |
virtual int | add_dependencies (const RtecEventComm::EventHeader &header, const TAO_EC_QOS_Info &qos_info) |
virtual void | get_qos_info (TAO_EC_QOS_Info &qos_info) |
Private Member Functions | |
TAO_EC_Sched_Filter (const TAO_EC_Sched_Filter &) | |
TAO_EC_Sched_Filter & | operator= (const TAO_EC_Sched_Filter &) |
void | init_rt_info (void) |
Initialize our RT_Info handle and dependencies. | |
void | compute_qos_info (TAO_EC_QOS_Info &qos_info) |
Compute a new qos_info to push up. | |
Private Attributes | |
RtecScheduler::handle_t | rt_info_ |
The RT_Info handle for this object. | |
int | rt_info_computed_ |
Has the Scheduler been updated? | |
ACE_CString | name_ |
Our operation name. | |
RtecScheduler::Scheduler_var | scheduler_ |
The scheduler we are going to use. | |
TAO_EC_Filter * | body_ |
The implementation. | |
RtecScheduler::handle_t | body_info_ |
The RT_Info handle for the body. | |
RtecScheduler::handle_t | parent_info_ |
The RT_Info handle for the parent. | |
RtecScheduler::Info_Type_t | info_type_ |
Required for the scheduling service. |
This filter decorates a regular filter with scheduling information. It creates a new RT_Info entry for the filter and it adds the dependencies between the filter and any childrens it may have.
It assumes ownership of the children.
Definition at line 44 of file EC_Sched_Filter.h.
|
Constructor. It assumes ownership of the , makes a copy of the other parameters Definition at line 12 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::adopt_child().
00020 : rt_info_ (rt_info), 00021 rt_info_computed_ (0), 00022 name_ (name), 00023 scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler)), 00024 body_ (body), 00025 body_info_ (body_info), 00026 parent_info_ (parent_info), 00027 info_type_ (info_type) 00028 { 00029 this->adopt_child (this->body_); 00030 } |
|
Destructor.
Definition at line 32 of file EC_Sched_Filter.cpp.
00033 { 00034 delete this->body_; 00035 } |
|
|
|
This is used for computing the scheduling dependencies: Leaf filters check if the header could be matched, similar to the can_match() method; if it does they return 1, and 0 otherwise. Intermediate nodes always return 0. This is used to build precise dependencies between the suppliers and the leaf of the filters that accept that event. Notice that only the nodes doing scheduling recurse through the list, so in configurations that do no require scheduling the recursion stops fairly soon. Implements TAO_EC_Filter. Definition at line 140 of file EC_Sched_Filter.cpp. References ACE_DEBUG, TAO_EC_Filter::add_dependencies(), begin(), end(), init_rt_info(), LM_DEBUG, and TAO_EC_QOS_Info::rt_info.
00142 { 00143 this->init_rt_info (); 00144 00145 int matches = this->body_->add_dependencies (header, 00146 qos_info); 00147 00148 if (matches != 0) 00149 { 00150 this->scheduler_->add_dependency (this->rt_info_, qos_info.rt_info, 1, 00151 RtecBase::TWO_WAY_CALL); 00152 00153 RtecScheduler::RT_Info_var info = 00154 this->scheduler_->get (qos_info.rt_info); 00155 ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", 00156 this->name_.c_str (), 00157 info->entry_point.in ())); 00158 } 00159 00160 ChildrenIterator end = this->end (); 00161 for (ChildrenIterator i = this->begin (); i != end; ++i) 00162 { 00163 (*i)->add_dependencies (header, qos_info); 00164 } 00165 return 0; 00166 } |
|
STL-like iterators Filters follow the Composite pattern. All filters expose the same interface as if they all had children, but for simple filters the iterators return an empty range. Reimplemented from TAO_EC_Filter. Definition at line 38 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::begin(). Referenced by add_dependencies(), and init_rt_info().
|
|
Returns 0 if an event with that header could never be accepted. This can used by the suppliers to filter out consumers that couldn't possibly be interested in their events. The rt_info and Implements TAO_EC_Filter. Definition at line 134 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::can_match().
|
|
Clear any saved state, must reset and assume no events have been received. Implements TAO_EC_Filter. Definition at line 122 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::clear().
|
|
Compute a new qos_info to push up.
Definition at line 71 of file EC_Sched_Filter.cpp. References init_rt_info(), TAO_EC_QOS_Info::preemption_priority, and TAO_EC_QOS_Info::rt_info. Referenced by push(), and push_nocopy().
00072 { 00073 this->init_rt_info (); 00074 00075 qos_info.rt_info = this->rt_info_; 00076 switch (this->info_type_) 00077 { 00078 default: 00079 case RtecScheduler::DISJUNCTION: 00080 break; 00081 00082 case RtecScheduler::CONJUNCTION: 00083 case RtecScheduler::OPERATION: 00084 { 00085 RtecScheduler::OS_Priority os_priority; 00086 RtecScheduler::Preemption_Subpriority_t p_subpriority; 00087 RtecScheduler::Preemption_Priority_t p_priority; 00088 this->scheduler_->priority (this->rt_info_, 00089 os_priority, 00090 p_subpriority, 00091 p_priority); 00092 qos_info.preemption_priority = p_priority; 00093 } 00094 } 00095 } |
|
Reimplemented from TAO_EC_Filter. Definition at line 44 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::end(). Referenced by add_dependencies(), and init_rt_info().
|
|
Filter this event, returns 1 if the event is accepted, 0 otherwise. Notice that there are two versions of the method, if the event is not const then filter can take ownership of the event.
Implements TAO_EC_Filter. Definition at line 56 of file EC_Sched_Filter.cpp. References RtecEventComm::EventSet, and TAO_EC_Filter::filter().
|
|
Implements TAO_EC_Filter. Definition at line 63 of file EC_Sched_Filter.cpp. References RtecEventComm::EventSet, and TAO_EC_Filter::filter_nocopy().
00065 { 00066 return this->body_->filter_nocopy (event, qos_info); 00067 } |
|
Obtain the QOS information for this filter, the default implementation returns an invalid QOS. Only the filters that support scheduling information implement this method.
Reimplemented from TAO_EC_Filter. Definition at line 169 of file EC_Sched_Filter.cpp. References init_rt_info(), and TAO_EC_QOS_Info::rt_info. Referenced by TAO_EC_Sched_Filter_Builder::recursive_build().
00170 { 00171 this->init_rt_info (); 00172 00173 qos_info.rt_info = this->rt_info_; 00174 } |
|
Initialize our RT_Info handle and dependencies.
Definition at line 177 of file EC_Sched_Filter.cpp. References ACE_DEBUG, begin(), end(), TAO_EC_Filter::get_qos_info(), LM_DEBUG, and TAO_EC_QOS_Info::rt_info. Referenced by add_dependencies(), compute_qos_info(), and get_qos_info().
00178 { 00179 if (this->rt_info_computed_) 00180 return; 00181 00182 // Provide dummy values the scheduler will compute them based on the 00183 // dependencies and the fact that this is a DISJUNCTION. 00184 this->scheduler_->set (this->rt_info_, 00185 RtecScheduler::VERY_LOW_CRITICALITY, 00186 0, // worst_cast_execution_time 00187 0, // typical_cast_execution_time 00188 0, // cached_cast_execution_time 00189 0, // period 00190 RtecScheduler::VERY_LOW_IMPORTANCE, 00191 0, // quantum 00192 0, // threads 00193 this->info_type_); 00194 00195 #if 0 00196 ChildrenIterator end = this->end (); 00197 for (ChildrenIterator i = this->begin (); i != end; ++i) 00198 { 00199 TAO_EC_Filter* filter = *i; 00200 00201 TAO_EC_QOS_Info child; 00202 filter->get_qos_info (child); 00203 00204 this->scheduler_->add_dependency (this->rt_info_, 00205 child.rt_info, 1, 00206 RtecBase::TWO_WAY_CALL); 00207 00208 RtecScheduler::RT_Info_var info = 00209 this->scheduler_->get (child.rt_info); 00210 ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", 00211 info->entry_point.in (), 00212 this->name_.c_str ())); 00213 00214 } 00215 #endif /* 0 */ 00216 00217 #if 1 00218 if (this->body_info_ != this->rt_info_) 00219 { 00220 this->scheduler_->add_dependency (this->rt_info_, 00221 this->body_info_, 00222 1, 00223 RtecBase::TWO_WAY_CALL); 00224 00225 RtecScheduler::RT_Info_var info = 00226 this->scheduler_->get (this->body_info_); 00227 ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", 00228 info->entry_point.in (), 00229 this->name_.c_str ())); 00230 } 00231 #endif /* 0 */ 00232 00233 #if 1 00234 this->scheduler_->add_dependency (this->parent_info_, 00235 this->rt_info_, 00236 1, 00237 RtecBase::TWO_WAY_CALL); 00238 00239 RtecScheduler::RT_Info_var info = 00240 this->scheduler_->get (this->parent_info_); 00241 ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", 00242 this->name_.c_str (), 00243 info->entry_point.in ())); 00244 #endif /* 0 */ 00245 00246 this->rt_info_computed_ = 1; 00247 } |
|
Returns the maximum size of the events pushed by this filter.
Implements TAO_EC_Filter. Definition at line 128 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::max_event_size().
00129 { 00130 return this->body_->max_event_size (); 00131 } |
|
|
|
This is called by the children when they accept an event and which to pass it up. Notice that there are two versions of the method, if the event is not const then filter can take ownership of the event. Implements TAO_EC_Filter. Definition at line 98 of file EC_Sched_Filter.cpp. References compute_qos_info(), RtecEventComm::EventSet, TAO_EC_Filter::parent(), and TAO_EC_Filter::push().
00100 { 00101 if (this->parent () != 0) 00102 { 00103 this->compute_qos_info (qos_info); 00104 00105 this->parent ()->push (event, qos_info); 00106 } 00107 } |
|
Implements TAO_EC_Filter. Definition at line 110 of file EC_Sched_Filter.cpp. References compute_qos_info(), RtecEventComm::EventSet, TAO_EC_Filter::parent(), and TAO_EC_Filter::push_nocopy().
00112 { 00113 if (this->parent () != 0) 00114 { 00115 this->compute_qos_info (qos_info); 00116 00117 this->parent ()->push_nocopy (event, qos_info); 00118 } 00119 } |
|
Reimplemented from TAO_EC_Filter. Definition at line 50 of file EC_Sched_Filter.cpp. References TAO_EC_Filter::size().
|
|
The implementation.
Definition at line 107 of file EC_Sched_Filter.h. |
|
The RT_Info handle for the body.
Definition at line 110 of file EC_Sched_Filter.h. |
|
Required for the scheduling service.
Definition at line 116 of file EC_Sched_Filter.h. |
|
Our operation name.
Definition at line 101 of file EC_Sched_Filter.h. |
|
The RT_Info handle for the parent.
Definition at line 113 of file EC_Sched_Filter.h. |
|
The RT_Info handle for this object.
Definition at line 95 of file EC_Sched_Filter.h. |
|
Has the Scheduler been updated?
Definition at line 98 of file EC_Sched_Filter.h. |
|
The scheduler we are going to use.
Definition at line 104 of file EC_Sched_Filter.h. |