Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 30 additions & 25 deletions BreakDownManager.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,72 +15,77 @@
#include "TeamManager.h"

struct config_fich_struct *inf_fich;

struct ids *msgid;
struct team *team_list;
struct semaphoreStruct *semaphore_list;

int start_breakdown = 0;

void endBreakDown(int signum){
free(semaphore_list);
free(inf_fich);
msgctl(msgid->msg_queue_id,IPC_RMID,NULL);
start_breakdown =0 ;
#ifdef DEBUG
printf("Break Down Manager is out!\n");
#endif
exit(0);

}

void waitSig(int signum){
pause();
}

void raceStartBreakdown(int signum){
start_breakdown = 1;
}

void createBreakdowns(struct ids *idsP){
void createBreakdowns(struct ids *idsP, sigset_t mask, sigset_t new_mask){

char log[MAX];

sigprocmask(SIG_BLOCK,&new_mask, NULL);
sem_wait(semaphore_list->writingMutex);


srand((unsigned) time(NULL));

for(int i= 0; i < inf_fich->number_of_teams; i++){

for(int j = 0; j < team_list[i].number_of_cars; j++){

int r = rand()%100;

if(r >= team_list[i].cars[j].reliability && team_list[i].cars[j].has_breakdown != 1){
int r = rand()%100;

char problem_string[200]="";
char car_number[3]="";
if(r >= team_list[i].cars[j].reliability && team_list[i].cars[j].has_breakdown != 1 && strcmp(team_list[i].cars[j].current_state,"TERMINADO") != 0 && strcmp(team_list[i].cars[j].current_state,"DESISTENCIA") != 0){

strcpy(problem_string,"NEW PROBLEM IN CAR ");
sprintf(car_number,"%2d",team_list[i].cars[j].car_number);
strcat(problem_string,car_number);
sprintf(log, "NEW PROBLEM IN CAR %02d",team_list[i].cars[j].car_number);
//printf("%s\n",log);
writeLog(log,semaphore_list->logMutex,inf_fich->fp);

printf("NEW PROBLEM IN CAR %2d\n",team_list[i].cars[j].car_number);
writeLog(problem_string,semaphore_list->logMutex,inf_fich->fp);
struct messageQ msg;

msg.mtype=i*inf_fich->number_of_cars+j+1;
msg.response = 1;

#ifdef DEBUG
#ifdef DEBUG
printf("Breakdown Sent(%s)\n", team_list[i].team_name);
#endif

msgsnd(idsP->msg_queue_id, &msg, sizeof(msg)-sizeof(long), 0);
msgsnd(idsP->msg_queue_id, &msg, sizeof(msg)-sizeof(long), IPC_NOWAIT);
}

}
}

sem_post(semaphore_list->writingMutex);

sigprocmask(SIG_UNBLOCK,&new_mask, NULL);
}


void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_listP, struct semaphoreStruct *semaphore_listP, struct ids *idsP){

sigset_t mask, new_mask;

printf("Breakdown id: %d\n", getpid());
//Ignore all unwanted signals!
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
Expand All @@ -89,11 +94,13 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGUSR2);
sigaddset(&new_mask, SIGTERM);
sigaddset(&new_mask, SIGUSR1);

sigprocmask(SIG_UNBLOCK,&new_mask, NULL);

signal(SIGUSR2,endBreakDown);
signal(SIGTERM,raceStartBreakdown);
signal(SIGUSR1, waitSig);

#ifdef DEBUG
printf("Breakdown Manager created(%ld)\n",(long)getpid());
Expand All @@ -102,21 +109,19 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li
inf_fich = inf_fichP;
team_list = team_listP;
semaphore_list = semaphore_listP;

msgid = idsP;

pause();



//Gives time to threads to be created
sleep(1);

while(start_breakdown == 1) {
sleep(inf_fich->T_Avaria);
createBreakdowns(idsP);
sleep(1/inf_fich->time_units_per_second * inf_fich->T_Avaria);

createBreakdowns(idsP, mask ,new_mask);

}

#ifdef DEBUG
printf("Breakdown Manager is out!\n");
#endif
exit(0);
}
Binary file modified BreakDownManager.o
Binary file not shown.
18 changes: 9 additions & 9 deletions MultipleProcessActions.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ void writeLog(char * string, sem_t *mutex,FILE *fp){
char buffer[550]="";

time_t rawtime;
struct tm * timeinfo;
struct tm timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
sprintf(buffer,"%.2d:%.2d:%.2d %s\n",timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec,string);
localtime_r ( &rawtime, &timeinfo);
sprintf(buffer,"%.2d:%.2d:%.2d %s\n",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,string);

sem_wait(mutex);

printf("%s",buffer);

fprintf(fp,"%s",buffer);
fflush(fp);
sem_post(mutex);
Expand All @@ -51,7 +53,7 @@ int writingNewCarInSharedMem(struct team *team_list, struct car *new_car, struct
team_list[i].cars[j] = *new_car;

sem_post(semaphore_list->writingMutex);
sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability);
sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %02d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability);
writeLog(carLog,semaphore_list->logMutex, inf_fich->fp);
return 0;
}
Expand All @@ -70,7 +72,7 @@ int writingNewCarInSharedMem(struct team *team_list, struct car *new_car, struct
team_list[i].number_of_cars = 1;

sem_post(semaphore_list->writingMutex);
sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability);
sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %02d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability);
writeLog(carLog,semaphore_list->logMutex, inf_fich->fp);
return 1;
}
Expand Down Expand Up @@ -184,19 +186,17 @@ void updateState(struct team *team_list, struct semaphoreStruct *semaphore_list,
//Prints the statistics of a race (could be midway or at the end). This has priority over writing actions
void readStatistics(struct config_fich_struct *inf_fich, struct team *team_list, struct semaphoreStruct *semaphore_list){


printf("entered here\n");
sem_wait(semaphore_list->writingMutex);

printf("yo\n");
//First line for team index second line for car index
int top5Teams[5][2] = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
int lastTeam[1][2] = {{-1,-1}};

getTop5Teams(inf_fich, team_list, top5Teams);
getLastTeam(inf_fich, team_list, lastTeam);
int total_breakdowns = amountBreakdowns(inf_fich, team_list);
int total_reffils = amountReffil(inf_fich, team_list);
int total_racing = amountRacing(inf_fich, team_list);

for(int i = 0; i<5; i++){
printf("Lugar: %d, Número Carro: %d, Nome Equipa: %s, Número Voltas: %d, Número de Paragens na Box: %d\n", i+1, team_list[top5Teams[i][0]].cars[top5Teams[i][1]].car_number
, team_list[top5Teams[i][0]].team_name
Expand Down
Binary file modified MultipleProcessActions.o
Binary file not shown.
Loading