/******************************************************************************* Arquivo: scheduler.c Autor: Gustavo Aschwanden Soviersovski Função: Realiza o schedule dos eventos no arquivo de configuração Última Edição em: 21/04/2019 *******************************************************************************/ #include #include #include "scheduler.h" #include "smpl.h" #include "nodo.h" #include "constants.h" extern tnodo nodo; //Faz o parse o arquivo 'scheduler.cfg' e retorna a lista de eventos a serem agendados tevent *parseConfig(int id){ FILE *config = fopen("scheduler.cfg","r"); char line[2048]; tevent *elist = (tevent *)calloc(1024, sizeof(tevent)); char *value; int i, linenum = 0; if (config) { while (fgets(line, sizeof line, config)) { //Se a linha corresponde ao id desejado if (linenum % 2 == 0 && atoi(line) == id) { //Le a linha seguinte e a converte para o formato de lista fgets(line, sizeof line, config); value = strtok(line, ", "); i = 0; while (value) { elist[i].e_type = atoi(value); value = strtok(NULL, ", "); elist[i].time = (double) atof(value); value = strtok(NULL, ", "); elist[i].nodo_id = atoi(value); value = strtok(NULL, ", "); i++; } fclose(config); return elist; } linenum++; } printf("Nao existe um escalonamento com id %d no arquivo scheduler.cfg\n", id); fclose(config); exit(-1); } else { puts("Arquivo 'scheduler.cfg' nao encontrado."); exit(-1); } } //Retorna o número de eventos da lista int listLength(tevent *eventlist) { int i = 0; while (eventlist[i].e_type != 0 || eventlist[i].time != 0 || eventlist[i].nodo_id != 0) i++; return i; } //Agenda todos os eventos double scheduler(int id, int n){ tevent *eventlist, *event; int i, eventNumber; eventlist = parseConfig(id); eventNumber = listLength(eventlist); for (i = 0; i < eventNumber; i++) { event = &eventlist[i]; schedule(event->e_type, event->time, event->nodo_id); } for (i = 0; i < n; i++) schedule(TEST, 10.0, i); return eventlist[eventNumber-1].time + 10*n; }