Ejemplo n.º 1
0
//////////////////////////////////////////////////////////////////  PUBLIC
//---------------------------------------------------- Fonctions publiques
void PorteSortie( int pmemIDNbPlace,
                  int pmemIDEtat,
                  int pmemIDRequete,
                  int pbalID,
                  int psemID)
// Mode d'emploi
// 	Processus fils Sortie
{
	memIDNbPlace = pmemIDNbPlace;
	memIDEtat = pmemIDEtat;
	memIDRequete = pmemIDRequete;
	balSortie = pbalID;
	semGene = psemID;

	InitialisationPorteSortie();

	for(;;){
		unsigned int numeroPlace;

		// Lecture sur le canal du numero de la place
		while
          (msgrcv(balSortie,&numeroPlace,sizeof(unsigned int),0,0) == -1);

		// p Operation --> Reservation sur MP NbPlace
		struct sembuf reserverNb = {MutexMPNbPlaces, -1,0};
		// v Operation --> liberation sur MP NbPLace
		struct sembuf libererNb  = {MutexMPNbPlaces, 1, 0};
		// Modifier le nombre de place occupées (décrémentation)
		// Réservation de la mémoire pour le nb de places occupées
		while(semop(semGene,&reserverNb,1)==-1 && errno==EINTR);
		NbPlaceOccupees* nbp =
                            (NbPlaceOccupees*) shmat(memIDNbPlace,NULL,0);
		unsigned int nbPlaceOccupee = nbp->nb;
		shmdt(nbp);
		// Libération de la mémoire NbPlace
		semop(semGene,&libererNb,1);

		if (nbPlaceOccupee == 0)
		{
			continue;
		}
		pid_t voiturierSortie;
		voiturierSortie = SortirVoiture(numeroPlace);

		// on stocke les voituriers en sortie pour pouvoir les supprimer
		// si on appuie sur E
		voituriersEnSortie.push_back(voiturierSortie);

	}

}
Ejemplo n.º 2
0
void Sortie(int id_mem_param, int id_sem_param, int id_bal_param)
// Algorithme :
//
{
//Recuperation des identifiants
	id_mem = id_mem_param;
	id_sem = id_sem_param;
	id_bal = id_bal_param;

	pid_t pidVoiturier;
	messageSortie voitureSortante;
	
	memoire = (MemoirePartagee*) shmat(id_mem,NULL,0);
	Voiture voiture;

	struct sigaction saChild; //pour le signal SIGCHLD
		sigemptyset(&saChild.sa_mask);
		saChild.sa_handler = HandleSignalSortie;
		saChild.sa_flags = 0;
		sigaction(SIGCHLD, &saChild, NULL);
	struct sigaction saUsr2; //pour le signal SIGUSR2
		sigemptyset(&saUsr2.sa_mask);
		saUsr2.sa_handler = HandlerFinProgrammeSortie;
		saUsr2.sa_flags = 0;
		sigaction(SIGUSR2, &saUsr2, NULL);

	for(;;){
		while(msgrcv( id_bal, &voitureSortante,sizeof(struct messageSortie), 4, 0) == -1);
		if(memoire->parking[voitureSortante.numPlace-1].usager != AUCUN){// si une voiture est présente sur la place
		voiture = memoire->parking[voitureSortante.numPlace-1];
		pidVoiturier = SortirVoiture(voitureSortante.numPlace);

			if(pidVoiturier!=-1){
				voituriers.insert(std::pair<pid_t, Voiture>(pidVoiturier, voiture));
			}
		}
	}
        	
} //----- fin de Sortie
Ejemplo n.º 3
0
static void Moteur()
// Algorithme :
{
	int index = 0;
 	for(;;)
 	{	StructDemandeSortie demande;
 		if(msgrcv(idBal, &demande, sizeof(StructDemandeSortie), 1, MSG_NOERROR) > 0)
 		{	index = getVoiturier();
	 		if(index == -1)
	 		{	Afficher(TypeZone::MESSAGE, "Attention plus de voiturier" );
	 		}
	 		else 
	 		{	if(voitureExiste(demande.place)) 
	 			{	if((pidVoituriers[index].numeroPlace = SortirVoiture(demande.place)) < 0) 
			 		{	Afficher(TypeZone::MESSAGE, "Erreur : Impossible de sortir une voiture" );
			 		}
			 	}
			 	else
			 	{	Afficher(TypeZone::MESSAGE, "La voiture n'existe pas" );
			 	}
	 		}
 		}
 	}
} //Fin de Moteur