00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "config.h"
00019
00020 #include <iostream>
00021
00022 #include <instrumentation.h>
00023
00024 #include "MaxDecayTaskAdvocate.hh"
00025
00026 using namespace std;
00027
00028 #ifndef max
00029 #define max(x, y) (((x) > (y)) ? (x) : (y))
00030 #endif
00031
00032
00033
00034
00035
00036 #define DECAY_AFTER 5
00037
00038 MaxDecayTaskAdvocate::MaxDecayTaskAdvocate(void)
00039 {
00040 this->md_LastAdvice = 0;
00041 this->md_Decay = DECAY_AFTER;
00042 this->md_DecayAfter = DECAY_AFTER;
00043 }
00044
00045 MaxDecayTaskAdvocate::~MaxDecayTaskAdvocate(void)
00046 {
00047 }
00048
00049 void MaxDecayTaskAdvocate::SetDelegateAttribute(const char *name,
00050 const CORBA::Any &value)
00051 throw (CORBA::SystemException)
00052 {
00053 if( (strcasecmp(name, "decay_after") == 0) ||
00054 (strcasecmp(name, "decay-after") == 0) ||
00055 (strcasecmp(name, "decay after") == 0) )
00056 {
00057 const char *str;
00058
00059 if( value >>= this->md_DecayAfter )
00060 {
00061 }
00062 else if( (value >>= str) &&
00063 (sscanf(str, "%d", &this->md_DecayAfter) == 1) )
00064 {
00065 }
00066 else
00067 {
00068 throw CORBA::BAD_PARAM();
00069 }
00070 }
00071 else
00072 {
00073 this->RealTimeTaskDelegateImpl::SetDelegateAttribute(name, value);
00074 }
00075 }
00076
00077 CORBA::Any_ptr MaxDecayTaskAdvocate::GetDelegateAttribute(const char *name)
00078 throw (CORBA::SystemException)
00079 {
00080 CORBA::Any_var retval;
00081
00082 if( name == NULL )
00083 {
00084 throw CORBA::BAD_PARAM();
00085 }
00086 else if( (strcasecmp(name, "decay_after") == 0) ||
00087 (strcasecmp(name, "decay-after") == 0) ||
00088 (strcasecmp(name, "decay after") == 0) )
00089 {
00090 retval = new CORBA::Any();
00091 (*retval) <<= this->md_DecayAfter;
00092 }
00093 else if( (strcasecmp(name, "last_advice") == 0) ||
00094 (strcasecmp(name, "last-advice") == 0) ||
00095 (strcasecmp(name, "last advice") == 0) )
00096 {
00097 retval = new CORBA::Any();
00098 (*retval) <<= this->md_LastAdvice;
00099 }
00100 else
00101 {
00102 retval = this->RealTimeTaskDelegateImpl::GetDelegateAttribute(name);
00103 }
00104 return( retval._retn() );
00105 }
00106
00107 Broker::CPUReserve MaxDecayTaskAdvocate::PassCPU(Broker::RealTimeTask_ptr rtt,
00108 const Broker::CPUReserve &status,
00109 const Broker::CPUReserve &advice,
00110 const Broker::KeyedReportParameters &krp)
00111 throw (CORBA::SystemException)
00112 {
00113 Broker::CPUReserve new_advice = advice;
00114
00115 if( CORBA::is_nil(this->dm_RemoteObject.in()) )
00116 {
00117 throw CORBA::BAD_INV_ORDER();
00118 }
00119
00120 if( new_advice.Compute >= this->md_LastAdvice )
00121 {
00122
00123 this->md_Decay = this->md_DecayAfter;
00124 this->md_SubMax = 0;
00125 new_advice.Compute += (CORBA::ULong)(0.01 * new_advice.Compute);
00126 }
00127 else if( this->md_Decay >= 0 )
00128 {
00129
00130 this->md_SubMax = max(this->md_SubMax, new_advice.Compute);
00131 this->md_Decay -= 1;
00132
00133 if( this->md_Decay == 0 )
00134 {
00135 new_advice.Compute = (CORBA::ULong)
00136 (this->md_SubMax + (0.01 * this->md_SubMax));
00137 this->md_SubMax = 0;
00138 this->md_Decay = this->md_DecayAfter;
00139 }
00140 else
00141 {
00142 new_advice.Compute = this->md_LastAdvice;
00143 }
00144 }
00145 this->md_LastAdvice = new_advice.Compute;
00146 return this->RealTimeTaskDelegateImpl::PassCPU(rtt,
00147 status,
00148 new_advice,
00149 krp);
00150 }