/* Programa: Simulacao do algoritmo VCube Autor: Eduardo Trevisan Data da ultima modificacao: 15/11/2021 */ #include #include #include "smpl.h" #include "cisj.h" #define POW_2(num) (1<<(num)) /*----Eventos----*/ #define test 1 #define fault 2 #define repair 3 /*----Descritor do nodo SMPL----*/ typedef struct { int id; /* identificador da facility SMPL */ int *state; /* vetor de estados dos nodos; conta numero de eventos */ int *failState; /* vetor que guarda estados falhos */ int s; /* indice do cluster sendo testado atualmente */ } tnodo; int main (int argc, char* argv[]) { static int N, /* numero total de processos, entrado na linha de comando */ token, /* o processo que "esta executando" em um instante de tempo */ event, r,i,j; static char fa_name[5]; /* nome da facility */ static float testInterval = 30.0; if(argc != 2) { puts("Uso correto: tempo < num-nodos"); exit(1); } N = atoi(argv[1]); smpl(0, "Um exemplo de simulacao"); reset(); stream(1); /* inicializacao de variaveis */ tnodo* nodo = (tnodo *) malloc(sizeof(tnodo)*N); for (i=0; isize; it++) { i = testList->nodes[it]; if (i >= N) break; if (status(nodo[i].id)!=0) /* nodo testado eh falho */ { printf(" nodo %d falho\n",i,time()); if (nodo[token].failState[i] != 1) { /* esta falha eh um evento novo? */ if (nodo[token].state[i] == -1) nodo[token].state[i] = 0; nodo[token].state[i] += 1; /* atualizando contador de eventos para i */ nodo[token].failState[i] = 1; /* atualizando nodo i para falho */ } } else /* nodo testado eh correto */ { printf(" nodo %d correto\n",i,time()); if (nodo[token].failState[i] != 0) /* este estado eh um evento novo? */ { if (nodo[token].state[i] == -1) nodo[token].state[i] += 1; nodo[token].state[i] += 1; /* incrementando contador de eventos para i */ nodo[token].failState[i] = 0; /* atualizando nodo i para correto */ } /* trocando info entre nodos token e i */ for (j=0;j= nodo[i].state[j]) { nodo[i].state[j] = nodo[token].state[j]; nodo[i].failState[j] = nodo[token].failState[j]; } else { nodo[token].state[j] = nodo[i].state[j]; nodo[token].failState[j] = nodo[i].failState[j]; } } nodo[token].state[token] = 0; nodo[token].failState[token] = 0; nodo[i].state[i] = 0; nodo[i].failState[i] = 0; if (nodo[i].state[token] == -1) nodo[i].state[token] = 0; nodo[i].failState[token] = 0; //printf("------------\n%d= ",token); //for (j=0;j (N>>1)+1) nodo[token].s = 1; /* imprimindo vetor de estados */ printf(" State[%d]: | ", token); for (i=0; i