Example #1
0
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;
}
Example #2
0
// 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);
    }
}