static void sigHandler(int signo) { if(signo == common_sig_t[0]) // start { if( semVal(pkg->sem_id , 0) > 0 ) { semlock(pkg->sem_id , 0); } } else if(signo == common_sig_t[1]) // stop { if( semVal(pkg->sem_id , 0) == 0) { semunlock(pkg->sem_id , 0); } } else if(signo == common_sig_t[2]) // koniec { semlock(pkg->sem_id, 4); // ustawienie flagi sygnalu do zabicia procesu nr 2 if( semVal(pkg->sem_id , 0) > 0 ) // jesli dostaniemy podczas waita { semlock(pkg->sem_id , 0); } } }
static void * mainLoop(void * write_pipe_fd ) { char * shm = pkg->shm_ptr; int * fd = (int *)write_pipe_fd; killfd = *fd; unsigned char readed_bytes; while(1) { semlock(pkg->sem_id, 2); if( !semVal(pkg->sem_id , 4) ) { kill(pid_p3,communication_sig_t[2]); // poinformowanie procesu 3 if( semVal(pkg->sem_id, 3) ) // ustawienie flagi sygnalu do zabicia procesu nr 1 { semlock(pkg->sem_id, 3); } if( semVal(pkg->sem_id , 0) > 0 ) { semlock(pkg->sem_id , 0); // jbc odblokowanie jesli dostalismy kill podczas stopu } semunlock(pkg->sem_id, 1); // wpuszczenie proc 1 do sprawdzenia flagi i zabicia sie write(killfd, &killfd , sizeof(char) ); // odblokowanie procesu nr 3 aby sie zabil break; /*pthread_cancel(thread); pthread_testcancel(); */ } readed_bytes = (unsigned char)shm[0]; write(*fd, &shm[1] ,readed_bytes); semunlock(pkg->sem_id , 1); } pthread_exit(EXIT_SUCCESS); }
static void communicationSigHandler(int signo) { if(signo == communication_sig_t[0]) // start { if( semVal(pkg->sem_id , 0) > 0 ) { semlock(pkg->sem_id , 0); } } else if(signo == communication_sig_t[1]) // stop { if( semVal(pkg->sem_id , 0) == 0) { semunlock(pkg->sem_id , 0); } } else if(signo == communication_sig_t[2]) // koniec { sigHandler(common_sig_t[2]); } }
void Entree(TypeBarriere typeBarriere) { //definition des id d'acces au boites aux lettres et semaphores long msgBufEntreeId; long msgbufRequeteId; unsigned short semElementSyncEntree; TypeZone zoneEcranRequete; switch (typeBarriere) { case PROF_BLAISE_PASCAL : //deja initialises aux bonnes valeurs; msgBufEntreeId = MSGBUF_ID_ENTREE_P; msgbufRequeteId = MSGBUF_ID_REQUETE_P; semElementSyncEntree = SEMELM_SINC_ENTREE_P; zoneEcranRequete = REQUETE_R1; break; case AUTRE_BLAISE_PASCAL : msgBufEntreeId = MSGBUF_ID_ENTREE_A; msgbufRequeteId = MSGBUF_ID_REQUETE_A; semElementSyncEntree = SEMELM_SINC_ENTREE_A; zoneEcranRequete = REQUETE_R2; break; case ENTREE_GASTON_BERGER : msgBufEntreeId = MSGBUF_ID_ENTREE_GB; msgbufRequeteId = MSGBUF_ID_REQUETE_GB; semElementSyncEntree = SEMELM_SINC_ENTREE_GB; zoneEcranRequete = REQUETE_R3; break; default : std::cerr << "not an entry process error" << std::endl; return; break; } //initialisation init(); //phase moteur pid_t pidCurr; Voiture voiture; for(;;) { //appel bloquant, attente d'une demande d'entree if(msgrcv(msgbuffId, &voiture, sizeof(Voiture)-sizeof(long), msgBufEntreeId, 0) == -1) continue; // sarestart (sur les erreurs aussi) DessinerVoitureBarriere(typeBarriere, voiture.typeUsager); if(semVal(SEMELM_PLACEDISPO) > 0) { if((pidCurr = GarerVoiture(typeBarriere)) != -1) { semP(SEMELM_PLACEDISPO); mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture)); } } else { //affiche requete AfficherRequete(typeBarriere,voiture.typeUsager,voiture.heureArrivee); Requete re; re.type = msgbufRequeteId; re.heureArrivee = voiture.heureArrivee; re.typeUsager = voiture.typeUsager; if(msgsnd(msgbuffId, &re, sizeof(Requete)-sizeof(long), 0 )==-1); semP(semElementSyncEntree); if((pidCurr = GarerVoiture(typeBarriere)) != -1) { //met à jour l'heure d'entree dans le parking voiture.heureArrivee = time(NULL); mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture)); } Effacer(zoneEcranRequete); } } }