func (vst Visitor) Run() { // Any runner should have the Run method fmt.Printf("%-6.3f \t Visitor %v arrives \n", godes.GetSystemTime(), vst.number) tableBusy.Wait(false) // this will wait till the tableBusy control becomes false tableBusy.Set(true) // sets the tableBusy control to true - the table is busy fmt.Printf("%-6.3f \t Visitor %v gets the table \n", godes.GetSystemTime(), vst.number) godes.Advance(service.Get(10, 60)) //the function advance the simulation time by the value in the argument tableBusy.Set(false) // sets the tableBusy control to false - the table is idle fmt.Printf("%-6.3f \t Visitor %v leaves \n", godes.GetSystemTime(), vst.number) }
func main() { for runs := 0; runs < 5; runs++ { for i := 0; i < 2; i++ { godes.AddRunner(&Waiter{&godes.Runner{}, i}) } godes.Run() for { visitorArrivalQueue.Place(Visitor{visitorsCount}) waitersSwt.Set(true) godes.Advance(arrival.Get(0, 30)) visitorsCount++ if godes.GetSystemTime() > shutdown_time { break } } waitersSwt.Set(true) godes.WaitUntilDone() // waits for all the runners to finish the Run() fmt.Printf(" Run # %v %v \n", runs, visitorArrivalQueue) //clear after each run arrival.Clear() service.Clear() waitersSwt.Clear() visitorArrivalQueue.Clear() godes.Clear() } }
func (machine *Machine) Run() { for { godes.Advance(processingGen.Get(PT_MEAN, PT_SIGMA)) machine.partsCount = machine.partsCount + 1 if godes.GetSystemTime() > SHUT_DOWN_TIME { break } } }
func (customer *Customer) Run() { arrivalTime := godes.GetSystemTime() patience := patienceGen.Get(MIN_PATIENCE, MAX_PATIENCE) fmt.Printf(" %6.3f Customer %v : Here I am My patience=%6.3f \n", godes.GetSystemTime(), customer.name, patience) counterAvailable.WaitAndTimeout(true, patience) if !counterAvailable.GetState() { fmt.Printf(" %6.3f Customer %v : RENEGED after %6.3f \n", godes.GetSystemTime(), customer.name, godes.GetSystemTime()-arrivalTime) } else { counterAvailable.Set(false) fmt.Printf(" %6.3f Customer %v : Waited %6.3f \n", godes.GetSystemTime(), customer.name, godes.GetSystemTime()-arrivalTime) godes.Advance(serviceGen.Get(1 / SERVICE_TIME)) fmt.Printf(" %6.3f Customer %v : Finished \n", godes.GetSystemTime(), customer.name) counterAvailable.Set(true) } }
func (waiter *Waiter) Run() { for { waitersSwt.Wait(true) if visitorArrivalQueue.Len() > 0 { visitor := visitorArrivalQueue.Get() if visitorArrivalQueue.Len() == 0 { waitersSwt.Set(false) } fmt.Printf("%-6.3f \t Visitor %v is invited by waiter %v \n", godes.GetSystemTime(), visitor.(Visitor).id, waiter.id) godes.Advance(service.Get(10, 60)) //advance the simulation time by the visitor service time fmt.Printf("%-6.3f \t Visitor %v leaves \n", godes.GetSystemTime(), visitor.(Visitor).id) } if godes.GetSystemTime() > shutdown_time && visitorArrivalQueue.Len() == 0 { fmt.Printf("%-6.3f \t Waiter %v ends the work \n", godes.GetSystemTime(), waiter.id) break } } }
func main() { for i := 0; i < 2; i++ { godes.AddRunner(&Waiter{&godes.Runner{}, i}) } godes.Run() for { visitorArrivalQueue.Place(Visitor{visitorsCount}) fmt.Printf("%-6.3f \t Visitor %v arrives \n", godes.GetSystemTime(), visitorsCount) waitersSwt.Set(true) godes.Advance(arrival.Get(0, 30)) visitorsCount++ if godes.GetSystemTime() > shutdown_time { break } } waitersSwt.Set(true) godes.WaitUntilDone() // waits for all the runners to finish the Run() fmt.Printf("Average Waiting Time %6.3f \n", visitorArrivalQueue.GetAverageTime()) }
func (machineRepair *MachineRepair) Run() { machine := machineRepair.machine for { godes.Advance(breaksGen.Get(1 / MTTF)) if machine.GetState() == godes.RUNNER_STATE_SCHEDULED { breakTime := godes.GetSystemTime() //interrupt machine godes.Interrupt(machine) repairManAvailableSwt.Wait(true) //repair repairManAvailableSwt.Set(false) godes.Advance(processingGen.Get(REPAIR_TIME, REPAIR_TIME_SIGMA)) //release repairman repairManAvailableSwt.Set(true) //resume machine and change the scheduled time to compensate the idle time godes.Resume(machine, godes.GetSystemTime()-breakTime) } if godes.GetSystemTime() > SHUT_DOWN_TIME { break } } }
func main() { var shutdown_time float64 = 8 * 60 godes.Run() for { //godes.GetSystemTime() is the current simulation time if godes.GetSystemTime() < shutdown_time { //the function acivates the Runner godes.AddRunner(Visitor{&godes.Runner{}, visitorsCount}) godes.Advance(arrival.Get(0, 70)) visitorsCount++ } else { break } } godes.WaitUntilDone() // waits for all the runners to finish the Run() }
func (waiter *Waiter) Run() { for { waitersSwt.Wait(true) if visitorArrivalQueue.Len() > 0 { visitorArrivalQueue.Get() if visitorArrivalQueue.Len() == 0 { waitersSwt.Set(false) } godes.Advance(service.Get(10, 60)) //advance the simulation time by the visitor service time } if godes.GetSystemTime() > shutdown_time && visitorArrivalQueue.Len() == 0 { break } } }
func (vst *Visitor) Run() { // Any runner should have the Run method fmt.Printf(" %-6.3f \t Visitor # %v arrives \n", godes.GetSystemTime(), vst.number) }