/*Programa tempo.c*/ #include #include #include "smpl.h" /*eventos*/ #define test 1 #define fault 2 #define repair 3 /*descritor do nodo*/ typedef struct{ int id; /*memoria local do nodo aqui*/ }tnodo; tnodo *nodo; int main(int argc, char const *argv[]) { static int N, token, event, r, i, testado; static char fa_name[5]; /*facility representa o objeto simulado*/ if(argc != 2){ puts("Uso correto: tempo "); exit(1); } N = atoi(argv[1]); smpl(0, "programa tempo"); reset(); stream(1); nodo = (tnodo*) malloc(sizeof(tnodo)*N); for (i = 0; i < N; i++) { memset(fa_name, '\0', 5); printf(fa_name, "%d", i); nodo[i].id = facility(fa_name, 1); } /*schedule inicial*/ for (i = 0; i < N; i++) schedule(test, 30.0, i); schedule(fault, 31.0, 1); schedule(repair, 69.0, 1); while(time() < 130.0) { cause(&event, &token); switch(event) { case test: testado = (token+1)%N;//próximo nodo no anel if(status(nodo[token].id) != 0) break;//se falho, quebra if(status(nodo[testado].id) != 0)//exibe mensagem dizendo se nodo está falho ou não printf("O nodo %d testou o nodo %d FALHO no tempo %5.1f\n", token, testado, time()); else printf("O nodo %d testou o nodo %d SEM-FALHA no tempo %5.1f\n", token, testado, time()); schedule(test, 30.0, token); break; case fault: r = request(nodo[token].id, token, 0); if(r != 0) { puts("Impossível falhar nodo"); exit(1); } printf("O nodo %d falhou no tempo %5.1f\n", token, time()); break; case repair: release(nodo[token].id, token); printf("O nodo %d recuperou no tempo %5.1f\n", token, time()); schedule(test, 30.0, token); } } return 0; }