00001 #include "ace/Dynamic_Message_Strategy.h"
00002
00003 #if !defined (__ACE_INLINE__)
00004 #include "ace/Dynamic_Message_Strategy.inl"
00005 #endif
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 84565 2009-02-23 08:20:39Z johnnyw $")
00015
00016 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00017
00018
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
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
00045 Priority_Status status = ACE_Dynamic_Message_Strategy::PENDING;
00046
00047
00048
00049
00050 ACE_Time_Value priority (tv);
00051 convert_priority (priority, mb);
00052
00053
00054 if (priority < ACE_Time_Value::zero)
00055 {
00056
00057
00058 priority += pending_shift_;
00059 if (priority < min_pending_)
00060 priority = min_pending_;
00061 }
00062
00063
00064 else if (priority > max_late_)
00065 {
00066
00067 mb.msg_priority (0);
00068 return ACE_Dynamic_Message_Strategy::BEYOND_LATE;
00069 }
00070
00071 else
00072 status = ACE_Dynamic_Message_Strategy::LATE;
00073
00074
00075
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
00082 return status;
00083 }
00084
00085
00086
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
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
00139
00140 priority -= mb.msg_deadline_time ();
00141 }
00142
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
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
00181
00182 priority += mb.msg_execution_time ();
00183 priority -= mb.msg_deadline_time ();
00184 }
00185
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
00202 }
00203
00204
00205 ACE_END_VERSIONED_NAMESPACE_DECL