#include "utility.h"
main(int argc, char **argv)
{
int padre;
int k=0,i,rcv=0,z,x;
int entra_in_campo,unoxvolta,privato;
int nproc;
int punteggio=0;
int coda;
bool flag=VERO;
matrice * gioco;
sms messaggio;
int fine;
notes block;
smallnotes finale;
if (argc > 1)
{
int nproc = atoi(argv[1]);
initarray(block,nproc,0);
if ((nproc % 2) == 0)
{
if (((entra_in_campo = creasem(CHIAVE,1)) != -1)&&
((unoxvolta = creasem(KEYMTX,1)) != -1) &&
((coda = creacoda(KEYCODA)) != -1))
{
gioco = (matrice *)(attachshm(creashm(KEYSHM, sizeof(matrice))));
for (i=1;i <= nproc ; i++)
{
if ((padre = fork()) != -1)
{
if (padre == 0) //codice figlio
{
down(entra_in_campo,0,-1);
printf("Entra in campo %d\n",getpid()); fflush(stdout);
for (z=1;z<=2;z++)
{
if (z==1)
{
privato= creasem(IPC_PRIVATE,1);
initsem(privato,0);
}
if (z==2)
{
printf("Rigioca %d\n",getpid()); fflush(stdout);
flag=VERO;
punteggio=0;
initsem(unoxvolta,1);
}
while(flag==VERO )
{
down(unoxvolta,0,-1);
//printf("GIOCO %d\n",getpid()); fflush(stdout);
flag = visita(gioco,nproc,&punteggio);
up(unoxvolta,0,1);
sleep(1);
}
crea_sms(getpid(),punteggio,privato,&messaggio);
sms_send(coda,&messaggio);
printf("Esce dal campo %d Punteggio %d\n",getpid(),punteggio);fflush(stdout);
down(privato,0,-1);
}
exit(0);
}
} else printf("Errore nella fork\n");
}
for (i=1; i <= nproc; i++)
{
fine = sms_rcv(coda,&messaggio);
salva_sms(block,k,&messaggio,fine);
k++;
rcv++;
if ((rcv%2)==0)
{
inizializzacampo(gioco,nproc);
stampacampo(gioco,nproc);
up(entra_in_campo,0,2);
}
if (rcv == nproc)
{
qsort(block, nproc, sizeof(data), blockcompare);
stamparray(block,nproc);
inizializzacampo(gioco,nproc);
stampacampo(gioco,nproc);
up(block[0].sem_id,0,1);
up(block[1].sem_id,0,1);
fine = sms_rcv(coda,&messaggio);
salva_sms(finale,0,&messaggio,fine);
fine = sms_rcv(coda,&messaggio);
salva_sms(finale,1,&messaggio,fine);
if (finale[0].punti>finale[1].punti)
{
printf("\nAnd the WINNER is %d\n\n",finale[0].pid);
fflush(stdout);
}
else
{
printf("\nAnd the WINNER is %d\n\n",finale[1].pid);
fflush(stdout);
}
for(x=0;x<nproc;x++)
{
kill(block[x].pid,SIGKILL);
delsem(block[x].sem_id);
}
}
}
}else printf("Errore nell'accesso ai semafori\n");
}else printf("\nAttenzione il programma necessita di parametro pari\n");
}else printf("\nAttenzione il programma necessita di parametro \n");
for(i=1;i<=nproc;i++) wait(0);
if (execl("2narbitro","2narbitro","0",NULL)== -1)
printf("\n Errore nel lancio dell'arbitro\n");
}