Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_TrafficModel.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  * (c)Copyright 2006 Hewlett-Packard Development Company, LP.
00017  *
00018  */
00019 
00020 #include "C_TrafficModel.hpp"
00021 #include "GeneratorTrace.hpp"
00022 #include "Utils.hpp" 
00023 
00024 #include <cmath>
00025 
00026 //#include <math.h> // for floor
00027 
00028 
00029 #define GET_TIME(clock) \
00030         {\
00031                 struct timezone tzp;\
00032                 gettimeofday (clock, &tzp);\
00033         }
00034 
00035 
00054 void C_TrafficModel::update ()
00055 {
00056   GET_TIME(&m_currentTimeval);
00057   // Period duration : ti - tp in mili-seconds
00058   m_sem_created_call->P();
00059   m_currentPeriodDuration = (m_currentTimeval.tv_sec - 
00060                              m_startPeriodDate.tv_sec)*1000 + 
00061                             (m_currentTimeval.tv_usec - 
00062                              m_startPeriodDate.tv_usec)/1000;
00063 
00064 
00065   //std::cerr <<  "update  m_currentPeriodDuration " << m_currentPeriodDuration << std::endl;
00066 
00067   // Traffic duration : ti - T0 in mili-seconds
00068   m_currentTrafficDuration = (m_currentTimeval.tv_sec - 
00069                              m_startTrafficDate.tv_sec ) * 1000 + 
00070                             (m_currentTimeval.tv_usec - 
00071                              m_startTrafficDate.tv_usec ) / 1000;
00072 
00073   m_sem_created_call->V();
00074 
00075 } /* end of update */
00076 
00077 
00078 
00079 void C_TrafficModel::reset ()
00080 {
00081 
00082   m_sem_created_call->P();
00083   if (m_currentPeriodDuration > m_periodDuration) {
00084     m_startPeriodDate.tv_sec  = m_currentTimeval.tv_sec;
00085     m_startPeriodDate.tv_usec = m_currentTimeval.tv_usec;
00086 
00087     m_nbCallCreatedInPeriod  = 0;
00088     m_currentPeriodDuration  = 0;
00089   }
00090   m_sem_created_call->V();
00091  
00092 
00093 } /* end of reset */
00094 
00095 
00096 
00097 int C_TrafficModel::init (long P_averageRate, 
00098                           long P_maxCreationPerPeriod, 
00099                           long P_setupTime,
00100                           long P_rateScale)
00101 {
00102    m_desiredAverageRate = P_averageRate;
00103    m_maxNbCreationPerPeriod = P_maxCreationPerPeriod; 
00104    m_periodDuration = 1000;
00105    m_nbCallCreatedInPeriod = 0;
00106    m_currentTrafficDuration = 0;
00107    m_createdCallNb = 0;
00108    m_currentPeriodDuration = 0;
00109    ms_setup_time = P_setupTime * 1000;
00110    m_rateScale = P_rateScale ;
00111 
00112    return (0);
00113 }
00114 
00115 
00116 void C_TrafficModel::start ()
00117 {
00118    GET_TIME (&m_startTrafficDate);
00119    GET_TIME (&m_startPeriodDate);
00120    GET_TIME (&m_currentTimeval);
00121 }
00122 
00123 
00124 void C_TrafficModel::call_created ()
00125 {
00126   m_sem_created_call->P();
00127   m_createdCallNb++;
00128   m_sem_created_call->V();
00129   m_sem_created_call_period->P();
00130   m_nbCallCreatedInPeriod++;
00131   m_sem_created_call_period->V();
00132 }
00133 
00134 
00147 //  int C_TrafficModel::authorize_new_call ()
00148 //  {
00149 //    int           L_callLimit;
00150 //    int           L_burstLimit;
00151 //    float         L_NB1, L_S1;
00152 //    float         L_NB2, L_NB3, L_S2;
00153 //    unsigned long L_outgoingTraffic;
00154 //    static bool   L_burst = false;
00155 
00156 //    long L_maxNbCreationPerPeriod ;
00157 //    long L_desiredAverageRate ;
00158 //    long L_createdCallNb ;
00159 //    long L_nbCallCreatedInPeriod ;
00160   
00161 //    update ();
00162 //    reset () ;
00163 
00164 //    m_sem_max->P();
00165 //    L_maxNbCreationPerPeriod = m_maxNbCreationPerPeriod ;
00166 //    m_sem_max->V();
00167 //    m_sem_desired->P();
00168 //    L_desiredAverageRate = m_desiredAverageRate ;
00169 //    m_sem_desired->V();
00170 //    m_sem_created_call->P();
00171 //    L_createdCallNb = m_createdCallNb ;
00172 //    m_sem_created_call->V();
00173 //    m_sem_created_call_period->P();
00174 //    L_nbCallCreatedInPeriod = m_nbCallCreatedInPeriod ;
00175 //    m_sem_created_call_period->V();
00176   
00177   
00178 //    // check m_currentTrafficDuration
00179 //    if (m_currentTrafficDuration <= ms_setup_time) {
00180 //      return (0);
00181 //    }
00182 //    L_outgoingTraffic = m_currentTrafficDuration - ms_setup_time;
00183 
00184 //    // compute L_callLimit
00185 
00186 //    GEN_DEBUG(0, "Outgoing Traffic Duration (ti-TO): " << (long) L_outgoingTraffic);
00187 //    GEN_DEBUG(0, "Desired Call Rate (VO)           : " << (long) L_desiredAverageRate);
00188 //    GEN_DEBUG(0, "Calls Already Created (Ni)       : " << (long) L_createdCallNb);
00189 
00190 //    L_NB1 = ( (float) ( (float) L_outgoingTraffic / (float) 1000.0) * 
00191 //          (float) L_desiredAverageRate);
00192 
00193 //    GEN_DEBUG(0, "NB1 = [ (ti - T0) * V0 ]         : " << L_NB1);
00194 
00195 //    if ( (float) L_createdCallNb >= L_NB1 ) {
00196 //      L_callLimit = 0;
00197 //    } else {
00198 //      L_S1 = L_NB1 - (float) L_createdCallNb;
00199 //      L_callLimit = (int) (floor (L_S1) + (fmodf (L_S1, 1.0) > 0 ? 1 : 0));
00200 //    }
00201 //    //GEN_DEBUG (C_Debug::E_LEVEL_5, "INFO", "L_callLimit = %d ", L_callLimit);
00202    
00203 //    if (!L_maxNbCreationPerPeriod) {
00204 //      return (L_callLimit); // no burstLimit
00205 //    }
00206 
00207 //    GEN_DEBUG(0, "Current Period Duration (ti-tp)           : " << m_currentPeriodDuration << " ms");
00208 //    GEN_DEBUG(0, "Max Call Creation per Period (Vp)         : " << L_maxNbCreationPerPeriod);
00209 //    GEN_DEBUG(0, "Period Duration (D0)                      : " << m_periodDuration << " ms");
00210 //    GEN_DEBUG(0, "Calls Already Created during Period (Np)  : " << m_nbCallCreatedInPeriod);
00211 
00212 //    // compute L_burstLimit
00213 //    L_NB2 = (float) L_nbCallCreatedInPeriod;
00214 //    //L_NB3 = (((float) m_currentPeriodDuration * (float) m_maxNbCreationPerPeriod) /
00215 //    // (P1)   ((float) m_periodDuration * (float) 1000.0));
00216 
00217 //    L_NB3 = (((float) m_currentPeriodDuration * 
00218 //          (float) L_maxNbCreationPerPeriod) /
00219 //         ((float) m_periodDuration));
00220 
00221 //    GEN_DEBUG(0, "NB3 = [ ( (ti - tp) / D0 ) * Vp ] : " << L_NB3);
00222 
00223 //    if (L_NB2 >= L_NB3) {
00224 //      L_burstLimit = 0;
00225 //    } else {
00226 //      L_S2 = L_NB3 - L_NB2;
00227 //      L_burstLimit = (int) (floor (L_S2) + (fmodf (L_S2, 1.0) > 0 ? 1 : 0));
00228 //    }
00229 
00230 //    GEN_DEBUG(0, "L_burstLimit = " << L_burstLimit);
00231 //    if (!L_callLimit) {
00232 //      GEN_DEBUG(0, "End of burst mode : reached expected call rate");
00233 //      L_burst = false;
00234 //    } else {
00235 //      if (!L_burstLimit) {
00236 //        // L_burstLimit may be null either if burst limit has been reached
00237 //        // or at the beginning of a new period
00238 //        if ((!L_burst) && (L_nbCallCreatedInPeriod)) {
00239 //      GEN_DEBUG(0, "Burst control : reached burst limit");
00240 //      L_burst = true;
00241 //        }
00242 //      }
00243 //    }
00244 //    return ((L_callLimit < L_burstLimit) ? L_callLimit : L_burstLimit);
00245 //  } /* end of authorize_new_call */
00246 
00247 
00248 C_TrafficModel::C_TrafficModel () 
00249 {
00250   NEW_VAR(m_sem_desired, C_Semaphore());
00251   NEW_VAR(m_sem_max, C_Semaphore());
00252   NEW_VAR(m_sem_created_call, C_Semaphore());
00253   NEW_VAR(m_sem_created_call_period, C_Semaphore());
00254 }
00255 
00256 
00257 C_TrafficModel::~C_TrafficModel()
00258 {
00259   DELETE_VAR(m_sem_desired);
00260   DELETE_VAR(m_sem_max);
00261   DELETE_VAR(m_sem_created_call);
00262   DELETE_VAR(m_sem_created_call_period);
00263 }
00264 
00265 
00266 unsigned long C_TrafficModel::get_desired_rate() {
00267   unsigned long L_return ;
00268   m_sem_desired->P();
00269   L_return = m_desiredAverageRate ;
00270   m_sem_desired->V();
00271   return (L_return);
00272 }
00273 
00274 void C_TrafficModel::change_desired_rate (unsigned long P_rate) {
00275   m_sem_desired->P();
00276   m_desiredAverageRate = P_rate ;
00277   re_init();
00278   m_sem_desired->V();
00279 }
00280 
00281 void C_TrafficModel::change_rate_scale (long P_rateScale) {
00282   m_rateScale = P_rateScale ;
00283 }
00284 
00285 
00286 void C_TrafficModel::increase_desired_rate () {
00287   m_sem_desired->P();
00288   m_desiredAverageRate += m_rateScale ;
00289   re_init();
00290   m_sem_desired->V();
00291 }
00292 
00293 void C_TrafficModel::decrease_desired_rate () {
00294   m_sem_desired->P();
00295   if (m_desiredAverageRate > m_rateScale) {
00296     m_desiredAverageRate -= m_rateScale ;
00297     re_init();
00298   }
00299   m_sem_desired->V();
00300 }
00301 
00302 void C_TrafficModel::change_max_created_calls (unsigned long P_max) {
00303   m_sem_max->P();
00304   m_maxNbCreationPerPeriod = P_max ;
00305   m_sem_max->V();
00306 }
00307 
00308 void C_TrafficModel::re_init() {
00309   m_sem_created_call->P();
00310   m_createdCallNb = 0;
00311   GET_TIME (&m_startTrafficDate);
00312   GET_TIME (&m_startPeriodDate);
00313   m_sem_created_call->V();
00314 }
00315 
00316 
00317 long C_TrafficModel::get_current_period_duration() {
00318   long          L_currentPeriodDuration ;
00319   
00320   m_sem_created_call->P();
00321   L_currentPeriodDuration = m_currentPeriodDuration ;
00322   m_sem_created_call->V();
00323 
00324   return (L_currentPeriodDuration);
00325 }

Generated on Wed Mar 7 14:44:58 2007 for Seagull by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002