// C++/CSIM Model of M/M/1 queue

#include "cpp.h"			// class definitions

#define NARS 5000
#define IAR_TM 2.0
#define SRV_TM 1.0

event done("done");			// the event named done
facility f("facility");			// the facility named f
table tbl("resp tms");			// table of response times
qhistogram qtbl("num in sys", 10l);	// qhistogram of number in system
int cnt;				// count of remaining processes

void traffic();
void customer();

extern "C" void sim(int, char **);

void sim(int argc, char *argv[])
{
	set_model_name("M/M/1 Queue");
	create("sim");

	cnt = NARS;
	
	traffic();			// generate traffic

	done.wait();			// wait for last customer to depart
	report();			// model report
	mdlstat();			// model statistics
}

void traffic()
{
	int i;

	create("traffic");    


        for (i=1; i<= NARS;i++){ 
              hold(expntl(IAR_TM));
	      customer();
        }
}
	
void customer()				// arriving customer
{
	float t1;

	create("cust");
	t1 = clock;			// record start time
	qtbl.note_entry();		// note arrival
	f.reserve();			// reserve facility
		hold(expntl(SRV_TM));	// service interval
	f.release();			// release facility
	tbl.record(clock - t1);		// record response time
	qtbl.note_exit();		// note departure
	if(--cnt == 0)
		done.set();		// if last customer, set done
}


