00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "C_TrafficDistribPoisson.hpp"
00021 #include "GeneratorTrace.hpp"
00022 #include "GeneratorError.h"
00023 #include "Utils.hpp"
00024
00025 #include <cmath>
00026
00027 #include "randomc.h"
00028 #define RANDOM_GENERATOR TRandomMersenne // define which random number generator to use
00029 #include "stocc.h"
00030
00031
00032 void FatalError(char * ErrorText) {
00033 GEN_FATAL(E_GEN_FATAL_ERROR,"Error in AgnerLib Poisson distribution: " << ErrorText);
00034 }
00035
00036 C_TrafficDistribPoisson::C_TrafficDistribPoisson () : C_TrafficModel() {
00037
00038 int L_seed;
00039
00040 m_LastFctCallTS = 0;
00041
00042 L_seed = time(0);
00043 NEW_VAR(m_sto, StochasticLib1(L_seed));
00044
00045 }
00046
00047
00048 C_TrafficDistribPoisson::~C_TrafficDistribPoisson() {
00049 }
00050
00051
00052
00053 int C_TrafficDistribPoisson::authorize_new_call ()
00054 {
00055 long L_desiredAverageRate ;
00056
00057 float L_poissonMean;
00058 float L_poissonVal = 0.0;
00059 long L_DeltaSinceLastFuncCall;
00060
00061 reset ();
00062 update ();
00063
00064 m_sem_desired->P();
00065 L_desiredAverageRate = m_desiredAverageRate ;
00066 m_sem_desired->V();
00067
00068 if (m_currentTrafficDuration <= ms_setup_time) {
00069 return (0);
00070 }
00071
00072 L_DeltaSinceLastFuncCall = m_currentTrafficDuration - m_LastFctCallTS;
00073
00074 L_poissonMean =( (float) ( (float) L_DeltaSinceLastFuncCall / (float) 1000.0) *
00075 (float) L_desiredAverageRate);
00076 L_poissonVal = m_sto->Poisson(L_poissonMean);
00077
00078 m_LastFctCallTS = m_currentTrafficDuration;
00079
00080 return ((int) L_poissonVal);
00081
00082 }
00083
00084