Dynamic_Message_Strategy.cpp

Go to the documentation of this file.
00001 #include "ace/Dynamic_Message_Strategy.h"
00002 
00003 #if !defined (__ACE_INLINE__)
00004 #include "ace/Dynamic_Message_Strategy.inl"
00005 #endif /* __ACE_INLINE__ */
00006 
00007 #include "ace/Guard_T.h"
00008 #include "ace/Log_Msg.h"
00009 #include "ace/Malloc_Base.h"
00010 #include "ace/OS_NS_string.h"
00011 
00012 ACE_RCSID (ace,
00013            Dynamic_Message_Strategy,
00014            "$Id: Dynamic_Message_Strategy.cpp 80826 2008-03-04 14:51:23Z wotte $")
00015 
00016 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00017 
00018 // ctor
00019 
00020 ACE_Dynamic_Message_Strategy::ACE_Dynamic_Message_Strategy (unsigned long static_bit_field_mask,
00021                                                             unsigned long static_bit_field_shift,
00022                                                             unsigned long dynamic_priority_max,
00023                                                             unsigned long dynamic_priority_offset)
00024   : static_bit_field_mask_ (static_bit_field_mask),
00025     static_bit_field_shift_ (static_bit_field_shift),
00026     dynamic_priority_max_ (dynamic_priority_max),
00027     dynamic_priority_offset_ (dynamic_priority_offset),
00028     max_late_ (0, dynamic_priority_offset - 1),
00029     min_pending_ (0, dynamic_priority_offset),
00030     pending_shift_ (0, dynamic_priority_max)
00031 {
00032 }
00033 
00034 // dtor
00035 
00036 ACE_Dynamic_Message_Strategy::~ACE_Dynamic_Message_Strategy (void)
00037 {
00038 }
00039 
00040 ACE_Dynamic_Message_Strategy::Priority_Status
00041 ACE_Dynamic_Message_Strategy::priority_status (ACE_Message_Block & mb,
00042                                                const ACE_Time_Value & tv)
00043 {
00044   // default the message to have pending priority status
00045   Priority_Status status = ACE_Dynamic_Message_Strategy::PENDING;
00046 
00047   // start with the passed absolute time as the message's priority, then
00048   // call the polymorphic hook method to (at least partially) convert
00049   // the absolute time and message attributes into the message's priority
00050   ACE_Time_Value priority (tv);
00051   convert_priority (priority, mb);
00052 
00053   // if the priority is negative, the message is pending
00054   if (priority < ACE_Time_Value::zero)
00055     {
00056       // priority for pending messages must be shifted
00057       // upward above the late priority range
00058       priority += pending_shift_;
00059       if (priority < min_pending_)
00060         priority = min_pending_;
00061     }
00062   // otherwise, if the priority is greater than the maximum late
00063   // priority value that can be represented, it is beyond late
00064   else if (priority > max_late_)
00065     {
00066       // all messages that are beyond late are assigned lowest priority (zero)
00067       mb.msg_priority (0);
00068       return ACE_Dynamic_Message_Strategy::BEYOND_LATE;
00069     }
00070   // otherwise, the message is late, but its priority is correct
00071   else
00072     status = ACE_Dynamic_Message_Strategy::LATE;
00073 
00074   // use (fast) bitwise operators to isolate and replace
00075   // the dynamic portion of the message's priority
00076   mb.msg_priority((mb.msg_priority() & static_bit_field_mask_) |
00077                   ((priority.usec () +
00078                     ACE_ONE_SECOND_IN_USECS * (suseconds_t)(priority.sec())) <<
00079                    static_bit_field_shift_));
00080 
00081   // returns the priority status of the message
00082   return status;
00083 }
00084 
00085 
00086 // Dump the state of the strategy.
00087 
00088 void
00089 ACE_Dynamic_Message_Strategy::dump (void) const
00090 {
00091 #if defined (ACE_HAS_DUMP)
00092   ACE_TRACE ("ACE_Dynamic_Message_Strategy::dump");
00093 
00094   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00095 
00096   ACE_DEBUG ((LM_DEBUG,
00097               ACE_TEXT ("static_bit_field_mask_ = %u\n")
00098               ACE_TEXT ("static_bit_field_shift_ = %u\n")
00099               ACE_TEXT ("dynamic_priority_max_ = %u\n")
00100               ACE_TEXT ("dynamic_priority_offset_ = %u\n")
00101               ACE_TEXT ("max_late_ = [%d sec, %d usec]\n")
00102               ACE_TEXT ("min_pending_ = [%d sec, %d usec]\n")
00103               ACE_TEXT ("pending_shift_ = [%d sec, %d usec]\n"),
00104               this->static_bit_field_mask_,
00105               this->static_bit_field_shift_,
00106               this->dynamic_priority_max_,
00107               this->dynamic_priority_offset_,
00108               this->max_late_.sec (),
00109               this->max_late_.usec (),
00110               this->min_pending_.sec (),
00111               this->min_pending_.usec (),
00112               this->pending_shift_.sec (),
00113               this->pending_shift_.usec ()));
00114 
00115   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00116 #endif /* ACE_HAS_DUMP */
00117 }
00118 
00119 ACE_Deadline_Message_Strategy::ACE_Deadline_Message_Strategy (unsigned long static_bit_field_mask,
00120                                                                unsigned long static_bit_field_shift,
00121                                                                unsigned long dynamic_priority_max,
00122                                                                unsigned long dynamic_priority_offset)
00123   : ACE_Dynamic_Message_Strategy (static_bit_field_mask,
00124                                   static_bit_field_shift,
00125                                   dynamic_priority_max,
00126                                   dynamic_priority_offset)
00127 {
00128 }
00129 
00130 ACE_Deadline_Message_Strategy::~ACE_Deadline_Message_Strategy (void)
00131 {
00132 }
00133 
00134 void
00135 ACE_Deadline_Message_Strategy::convert_priority (ACE_Time_Value & priority,
00136                                                  const ACE_Message_Block & mb)
00137 {
00138   // Convert absolute time passed in tv to negative time
00139   // to deadline of mb with respect to that absolute time.
00140   priority -= mb.msg_deadline_time ();
00141 }
00142   // dynamic priority conversion function based on time to deadline
00143 
00144 void
00145 ACE_Deadline_Message_Strategy::dump (void) const
00146 {
00147 #if defined (ACE_HAS_DUMP)
00148   ACE_TRACE ("ACE_Deadline_Message_Strategy::dump");
00149 
00150   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00151 
00152   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("ACE_Dynamic_Message_Strategy base class: \n")));
00153   this->ACE_Dynamic_Message_Strategy::dump ();
00154 
00155   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nderived class: ACE_Deadline_Message_Strategy\n")));
00156 
00157   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00158 #endif /* ACE_HAS_DUMP */
00159 }
00160 
00161 ACE_Laxity_Message_Strategy::ACE_Laxity_Message_Strategy (unsigned long static_bit_field_mask,
00162                                                           unsigned long static_bit_field_shift,
00163                                                           unsigned long dynamic_priority_max,
00164                                                           unsigned long dynamic_priority_offset)
00165   : ACE_Dynamic_Message_Strategy (static_bit_field_mask,
00166                                   static_bit_field_shift,
00167                                   dynamic_priority_max,
00168                                   dynamic_priority_offset)
00169 {
00170 }
00171 
00172 ACE_Laxity_Message_Strategy::~ACE_Laxity_Message_Strategy (void)
00173 {
00174 }
00175 
00176 void
00177 ACE_Laxity_Message_Strategy::convert_priority (ACE_Time_Value & priority,
00178                                                const ACE_Message_Block & mb)
00179 {
00180   // Convert absolute time passed in tv to negative
00181   // laxity of mb with respect to that absolute time.
00182   priority += mb.msg_execution_time ();
00183   priority -= mb.msg_deadline_time ();
00184 }
00185   // dynamic priority conversion function based on laxity
00186 
00187 void
00188 ACE_Laxity_Message_Strategy::dump (void) const
00189 {
00190 #if defined (ACE_HAS_DUMP)
00191   ACE_TRACE ("ACE_Laxity_Message_Strategy::dump");
00192 
00193   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00194 
00195   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("ACE_Dynamic_Message_Strategy base class: \n")));
00196   this->ACE_Dynamic_Message_Strategy::dump ();
00197 
00198   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nderived class: ACE_Laxity_Message_Strategy\n")));
00199 
00200   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00201 #endif /* ACE_HAS_DUMP */
00202 }
00203   // Dump the state of the strategy.
00204 
00205 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:39 2010 for ACE by  doxygen 1.4.7