Skip to content

Commit

Permalink
Risolto bug nel rilascio del semaforo studente
Browse files Browse the repository at this point in the history
  • Loading branch information
stefa168 committed Jan 26, 2019
1 parent 3bffd95 commit f6c222e
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 24 deletions.
5 changes: 1 addition & 4 deletions Gestore.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ int main(int argc, char *argv[]) {
/* Mandiamo in sleep il gestore. Se questa linea è rimossa, l'intera simulazione non può aver luogo. */
sleep((unsigned int) settings->sim_duration);


printf("\n\n"
"################################### GESTORE ####################################\n"
"#### Tempo scaduto; la simulazione termina. Invio segnale di terminazione ####\n"
Expand All @@ -80,7 +79,6 @@ int main(int argc, char *argv[]) {
/* SIGUSR1 è utilizzato per indicare ai processi figli la fine della simulazione, così da uscire dal while(true) */
raiseSignalToStudents(SIGUSR1);


printf("[GESTORE] Attendo che tutti i processi figli terminino la simulazione...\n");

waitForZero(semid, SEMAPHORE_EVERYONE_ENDED);
Expand All @@ -95,7 +93,7 @@ int main(int argc, char *argv[]) {
/* Calcoliamo i voti degli studenti. */
calculateStudentsMarks();

printf("[GESTORE] Voti pronti, avviso gli studenti!\n");
printf("\n[GESTORE] Voti pronti, avviso gli studenti!\n");
reserveSemaphore(semid, SEMAPHORE_MARKS_AVAILABLE);

/* Attendiamo con una wait che tutti i processi finiscano di stampare. da questo momento il programma termina. */
Expand All @@ -109,7 +107,6 @@ int main(int argc, char *argv[]) {

printf("Ecco i risultati: \n");


printSimulationResults();

freeAllocatedMemory();
Expand Down
38 changes: 20 additions & 18 deletions Studente.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ int main(int argc, char *argv[]) {
alarm(settings->sim_duration - 1);

while (true) {
/*if (checkForMessages(false)) {
if (checkForMessages(false)) {
stopAcceptingInvites();
}*/
}

// if(!trySendingInvites()) {
// checkForMessages(true);
Expand Down Expand Up @@ -96,7 +96,8 @@ void stopAcceptingInvites() {
* Nel caso in cui utilizziamo getMessage in modalità bloccante, ritornerà sempre true dopo aver ricevuto un messaggio
* per cui rimarrà qui fino alla fine della simulazione.
*/
while (getMessage(messageQueueID, &message, myID, true)) {
while (true) {
getMessage(messageQueueID, &message, myID, true);
switch (message.type) {

case INVITE: {
Expand Down Expand Up @@ -240,9 +241,9 @@ void simulationAlmostEnded(int sigid) {
getpid(), myID, getStatusString(), getGroupParticipantCount(), this->nofElemsPref);
// releaseSemaphore(semaphoresID, SEMAPHORE_CAN_PRINT);

// reserveStudentSemaphore(semaphoresID, myID);
reserveStudentSemaphore(semaphoresID, myID);
closeMyGroup();
// releaseStudentSemaphore(semaphoresID, myID);
releaseStudentSemaphore(semaphoresID, myID);

stopAcceptingInvites();
}
Expand All @@ -256,6 +257,8 @@ void simulationEnd(int sigid) {
reserveSemaphore(semaphoresID, SEMAPHORE_EVERYONE_ENDED);
waitForZero(semaphoresID, SEMAPHORE_EVERYONE_ENDED);



/*
* A questo punto la simulazione è terminata. Manca solo che il gestore calcoli i voti.
*/
Expand All @@ -280,18 +283,17 @@ bool getMessage(int msgqid, SimMessage *msgPointer, int msgType, bool hasToWaitF

msgrcv(msgqid, msgPointer, sizeof(SimMessage) - sizeof(long), msgType, flags);

if (errno) {
if (errno == ENOMSG) {
printf("[%d-%d] Nessun messaggio da ricevere\n", getpid(), myID);
errno = 0;
return false;
} else if(errno == EINTR) {
printf("[%d-%d] Attesa ricezione messaggio interrotta\n", getpid(), myID);
errno = 0;
return false;
} else {
PRINT_IF_ERRNO_EXIT(-1)
}

if (errno == ENOMSG) {
// printf("[%d-%d] Nessun messaggio da ricevere\n", getpid(), myID);
errno = 0;
return false;
} else if (errno == EINTR) {
printf("[%d-%d] Attesa ricezione messaggio interrotta\n", getpid(), myID);
errno = 0;
return false;
} else if (errno) {
PRINT_IF_ERRNO_EXIT(-1)
}

PRINT_IF_ERRNO_EXIT(-1)
Expand Down Expand Up @@ -319,7 +321,7 @@ bool sendMessage(int msgqid, int toStudentID, MessageType type, bool mustSend) {
printf("[%d-%d] Non abbastanza spazio per inviare il messaggio.\n", getpid(), myID);
errno = 0;
return false;
} else if(errno == EINTR) {
} else if (errno == EINTR) {
printf("[%d-%d] Attesa invio messaggio interrotta\n", getpid(), myID);
errno = 0;
return false;
Expand Down
8 changes: 7 additions & 1 deletion utilities/ipc_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,9 @@ void reserveStudentSemaphore(int id, int studentID) {

semop(id, &myOp, 1);

if(errno == ENOMSG)
errno = 0;

PRINT_IF_ERRNO_EXIT(-1)
#ifdef IPC_SEM_DEBUG
printf("[SEMAFORI] %d: Riserva del semaforo studente %d riuscita\n", getpid(), studentID);
Expand All @@ -277,14 +280,17 @@ void releaseStudentSemaphore(int id, int studentID) {
struct sembuf myOp;

myOp.sem_num = (unsigned short) (SEMAPHORE_STUDENT_BASE_ID + studentID);
myOp.sem_num = +1;
myOp.sem_op = +1;
myOp.sem_flg = 0;

#ifdef IPC_SEM_DEBUG
printf("[SEMAFORI] %d: Tentativo di rilascio del semaforo studente %d\n", getpid(), studentID);
#endif
semop(id, &myOp, 1);

if(errno == ENOMSG)
errno = 0;

PRINT_IF_ERRNO_EXIT(-1)
#ifdef IPC_SEM_DEBUG
printf("[SEMAFORI] %d: Rilascio del semaforo studente %d riuscito\n", getpid(), studentID);
Expand Down
2 changes: 1 addition & 1 deletion utilities/ipc_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#define PROGETTO_SO_IPC_UTILS_H

//#define IPC_MEM_DEBUG
//#define IPC_SEM_DEBUG
#define IPC_SEM_DEBUG
//#define IPC_MSG_DEBUG

#include <sys/types.h>
Expand Down

0 comments on commit f6c222e

Please sign in to comment.