#include <iostream.h>
#include "wq.h"
#include "fes.h"
#include "distribution.h"
#include <sys/types.h>
#include <sys/resource.h>
 
long cputime (){
  struct rusage rus; 
  getrusage (RUSAGE_SELF, &rus);
  return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
}




class Ereignis: public Event{
  public:
  void execute ();
  Ereignis(double deltatime):Event(deltatime){};
};


int akt_size=0;
long anzahl=0;
long start_zeit=0;
long dauer=0;
long size=0;
long test=0;

/*************************************************************************/
void Ereignis::execute() {
/*************************************************************************/

// HOLD-Modell: Pro Entnahme aus der FES ein neues Ereignis:
  new Ereignis(Exponential(1.0));
  

// Die FES waechst langsam auf die gewuenschte Groesse:
  if ( (akt_size < size) && (Random() <0.3) ) {
    new Ereignis(Exponential(1.0));
    akt_size+=1;
  }

// Beginn der Zeitmessung, wenn die Groesse erreicht ist:
  if ( (akt_size==size) && (anzahl==0) ) {
    start_zeit=cputime ();
    anzahl=1;
  }


// Es wird "anzahl"-oft wiederholt, bis die Gesamtzeitzeit 
// 2 Sekunden ueberschreitet:
  if (anzahl > 0 ) {
    test +=1; 
    if (test == anzahl) {
      dauer=cputime()-start_zeit;
      cout << test << " " << dauer << " d"  <<endl;
      if (dauer > 2000) Sim_Ende();
      else anzahl += anzahl;
    }
  }
}

int main() {

  cin >> size;
  new Ereignis(0.0);

  Simulation();

  cout << "Dauer: "<<double(dauer)/anzahl
       << "ms (bei Anzahl = " << anzahl
       << " und gesamter Dauer = " << dauer
       << "ms)" << endl;
}
