static void arrival_process(struct system_t *system) { struct customer_t customer; system->current_time = system->arrival_time; /* time 1000 hours check */ #ifdef __1000_HOURS__ if (system->current_time > SIM_TIME) { if (system->idle_time != 0) { /* record idle time */ system->total_idle_time += SIM_TIME - system->idle_time; system->idle_time = 0; } return ; } #endif system->total_arrived++; system->total_event++; /* queue up */ customer = generate_customer(system->current_time); queue_push(&system->queue, &customer); //performance(system->current_time, customer.id, ARRIVAL); /* calculate next customer arrival time */ system->arrival_time = system->current_time + get_time(ARRIVAL); if (system->queue.count == 1) { /* calculate service time */ system->service_time = get_time(DEPARTURE); system->total_service_time += system->service_time; system->departure_time = system->current_time + system->service_time; } else if (system->queue.count > 1) { system->area += (system->queue.count - 1)*(system->current_time - system->preview_time); /* new queue */ system->total_queue++; system->total_queue_customer += system->queue.count - 1; /* 1 for serverd */ system->max_queue_len = MAX(system->max_queue_len , system->queue.count - 1); } if (system->idle_time != 0) { /* record idle time */ system->total_idle_time += system->current_time - system->idle_time; system->idle_time = 0; } system->preview_time = system->current_time; }
// event handler static void event_handle(Event* e) { Component* component = component_list[e->component_id]; switch(e->event_type) { case ARRIVAL: { Customer *c; double next_time = generate_customer(C2G(component),e->timestamp,&c); Event* departure_event = event_router(c,C2G(component)->D); if(departure_event) { schedule_event(departure_event); } Event *arrival_event = e;//reuse e->timestamp = next_time; schedule_event(arrival_event); }break; case DEPARTURE: { Queue* queue = C2Q(component); Customer *c = out_queue(queue); c->time_serve = e->serve_time; double next_time = simulation_serve(c,queue); Event* departure_event = event_router(c,queue->D); if(departure_event) { schedule_event(departure_event); } if(!is_queue_empty(queue)) { Event* next_departure_event = e; next_departure_event->timestamp = next_time; next_departure_event->serve_time = next_time - now_time; schedule_event(next_departure_event); }else free(e); }break; default: printf("event type error\n"); exit(-1); } }