//#exemplo tempo.c //Tarefa 4 #include #include #include "smpl.h" /*eventos*/ #define test 1 #define fault 2 #define repair 3 #define mostre 4 /*descritor do nodo*/ typedef struct { int id; /*identidificador de facility*/ int* state; // identificador de status /*variaveis sao declaradas aqui*/ }tnodo; tnodo *nodo; main (int argc, char *argv[]){ static int n, token, event, r,i,j,k,total_rodada,falhou,stop,ntestes,testes_falhos; static char fa_name[5]; if (argc !=2){ puts("use correto: tempo"); exit(1); } n = atoi (argv[1]); smpl(0,"um exemplo de simulação"); reset(); stream(i); /*inicialização*/ nodo= (tnodo*) malloc (sizeof (tnodo)*n); total_rodada=0; falhou=-1; stop=1; ntestes=0; testes_falhos=0; for (i=0; i < n; i++){ memset(fa_name, '\0', 5); sprintf(fa_name, "%d", i); nodo[i].id=facility(fa_name,1); nodo[i].state = (int*) malloc (sizeof (int) *n); //aloca espaco pro vetor dinamico for (j=0; j < n; j++) //laco para completar o vetor come stado indeterminado if (i==j) nodo[i].state[j] = 0; //seu estado else nodo[i].state[j] = -1; //estado indeterminado } /*escalonamento inicial dos eventos*/ for (i=0; i < n; i++){ schedule(test, 30.0, i); } schedule(fault, 31.0, 2); schedule(repair, 121.0, 2); schedule(mostre, 30.0, 0); /*dispara o tempo de simulacao*/ while (time() < 270.0) { cause (&event,&token); switch (event) { case test: if(status (nodo[token].id)!=0) ///nodo esta falho, cai fora break; int prox = token; // proximo recebe o token do { prox = (prox+1)%n; //logica para anel if (prox != token){ // executa somente se o proximo nao for o próprio nodo if (status (nodo[prox].id)==0) { nodo[token].state[prox] = 0; k = prox; do { k = (k+1)%n; if (k != token) // o nodo sabe seu proprio estado nodo[token].state[k] = nodo[prox].state[k];//recebe } while (k != token); } else nodo[token].state[prox] = 1; //estado falho printf("o nodo %d vai testar o nodo %d no tempo %5.1f ", token, prox, time()); /*IMPRIME O VETOR */ printf("\tvetor nodo %d =[", token); for(i=0; i