C_TrafficDistribBestEffort Class Reference

Inheritance diagram for C_TrafficDistribBestEffort:

C_TrafficModel List of all members.

Public Member Functions

 C_TrafficDistribBestEffort ()
 ~C_TrafficDistribBestEffort ()
int authorize_new_call ()

Detailed Description

Definition at line 27 of file C_TrafficDistribBestEffort.hpp.


Member Function Documentation

int C_TrafficDistribBestEffort::authorize_new_call  )  [virtual]
 

authorize_new_call

The following internal variables are used (see also update()):

  • m_desiredAverageRate (in)
  • m_createdCallNb (in)
  • m_maxNbCreationPerPeriod (in)
  • m_periodDuration (in)
  • m_currentTrafficDuration (in)

Implements C_TrafficModel.

Definition at line 40 of file C_TrafficDistribBestEffort.cpp.

References C_TrafficModel::m_createdCallNb, C_TrafficModel::m_currentPeriodDuration, C_TrafficModel::m_currentTrafficDuration, C_TrafficModel::m_desiredAverageRate, C_TrafficModel::m_maxNbCreationPerPeriod, C_TrafficModel::m_nbCallCreatedInPeriod, C_TrafficModel::m_periodDuration, C_TrafficModel::m_sem_created_call, C_TrafficModel::m_sem_created_call_period, C_TrafficModel::m_sem_desired, C_TrafficModel::m_sem_max, C_TrafficModel::ms_setup_time, C_Semaphore::P(), C_TrafficModel::reset(), C_TrafficModel::update(), and C_Semaphore::V().

00041 {
00042   int           L_callLimit;
00043   int           L_burstLimit;
00044   float         L_NB1, L_S1;
00045   float         L_NB2, L_NB3, L_S2;
00046   unsigned long L_outgoingTraffic;
00047   static bool   L_burst = false;
00048 
00049   long L_maxNbCreationPerPeriod ;
00050   long L_desiredAverageRate ;
00051   long L_createdCallNb ;
00052   long L_nbCallCreatedInPeriod ;
00053   
00054   update ();
00055   reset () ;
00056 
00057   m_sem_max->P();
00058   L_maxNbCreationPerPeriod = m_maxNbCreationPerPeriod ;
00059   m_sem_max->V();
00060   m_sem_desired->P();
00061   L_desiredAverageRate = m_desiredAverageRate ;
00062   m_sem_desired->V();
00063   m_sem_created_call->P();
00064   L_createdCallNb = m_createdCallNb ;
00065   m_sem_created_call->V();
00066   m_sem_created_call_period->P();
00067   L_nbCallCreatedInPeriod = m_nbCallCreatedInPeriod ;
00068   m_sem_created_call_period->V();
00069   
00070   
00071   // check m_currentTrafficDuration
00072   if (m_currentTrafficDuration <= ms_setup_time) {
00073     return (0);
00074   }
00075   L_outgoingTraffic = m_currentTrafficDuration - ms_setup_time;
00076 
00077   GEN_DEBUG(0, "Outgoing Traffic Duration (ti-TO): " << (long) L_outgoingTraffic);
00078   GEN_DEBUG(0, "Desired Call Rate (VO)           : " << (long) L_desiredAverageRate);
00079   GEN_DEBUG(0, "Calls Already Created (Ni)       : " << (long) L_createdCallNb);
00080 
00081   L_NB1 = ( (float) ( (float) L_outgoingTraffic / (float) 1000.0) * 
00082             (float) L_desiredAverageRate);
00083 
00084   GEN_DEBUG(0, "NB1 = [ (ti - T0) * V0 ]         : " << L_NB1);
00085 
00086   if ( (float) L_createdCallNb >= L_NB1 ) {
00087     L_callLimit = 0;
00088   } else {
00089     L_S1 = L_NB1 - (float) L_createdCallNb;
00090     L_callLimit = (int) (floor (L_S1) + (fmodf (L_S1, 1.0) > 0 ? 1 : 0));
00091   }
00092    
00093   if (!L_maxNbCreationPerPeriod) {
00094     return (L_callLimit); // no burstLimit
00095   }
00096 
00097   GEN_DEBUG(0, "Current Period Duration (ti-tp)           : " << m_currentPeriodDuration << " ms");
00098   GEN_DEBUG(0, "Max Call Creation per Period (Vp)         : " << L_maxNbCreationPerPeriod);
00099   GEN_DEBUG(0, "Period Duration (D0)                      : " << m_periodDuration << " ms");
00100   GEN_DEBUG(0, "Calls Already Created during Period (Np)  : " << m_nbCallCreatedInPeriod);
00101 
00102   // compute L_burstLimit
00103   L_NB2 = (float) L_nbCallCreatedInPeriod;
00104   //L_NB3 = (((float) m_currentPeriodDuration * (float) m_maxNbCreationPerPeriod) /
00105   // (P1)       ((float) m_periodDuration * (float) 1000.0));
00106 
00107   L_NB3 = (((float) m_currentPeriodDuration * 
00108             (float) L_maxNbCreationPerPeriod) /
00109            ((float) m_periodDuration));
00110 
00111   GEN_DEBUG(0, "NB3 = [ ( (ti - tp) / D0 ) * Vp ] : " << L_NB3);
00112 
00113   if (L_NB2 >= L_NB3) {
00114     L_burstLimit = 0;
00115   } else {
00116     L_S2 = L_NB3 - L_NB2;
00117     L_burstLimit = (int) (floor (L_S2) + (fmodf (L_S2, 1.0) > 0 ? 1 : 0));
00118   }
00119 
00120   GEN_DEBUG(0, "L_burstLimit = " << L_burstLimit);
00121   if (!L_callLimit) {
00122     GEN_DEBUG(0, "End of burst mode : reached expected call rate");
00123     L_burst = false;
00124   } else {
00125     if (!L_burstLimit) {
00126       // L_burstLimit may be null either if burst limit has been reached
00127       // or at the beginning of a new period
00128       if ((!L_burst) && (L_nbCallCreatedInPeriod)) {
00129         GEN_DEBUG(0, "Burst control : reached burst limit");
00130         L_burst = true;
00131       }
00132     }
00133   }
00134   return ((L_callLimit < L_burstLimit) ? L_callLimit : L_burstLimit);
00135 } /* end of authorize_new_call */


The documentation for this class was generated from the following files:
Generated on Wed Mar 7 14:57:56 2007 for Seagull by  doxygen 1.4.6