int main(int argc, char ** argv) { verifier_arguments(argc, argv); const int nombre_producteurs = atoi(argv[1]); const int nombre_consommateurs = atoi(argv[2]); const int taille_tampon = (argc != 4) ? TAILLE_TAMPON_DEFAUT : atoi(argv[3]); tampon_t * tampon = creer_tampon(taille_tampon); /* À faire avant le changement du handler de SIGINT ! */ limite = creer_limite(); config_handler(SIGINT, handler_sigint); acteurs_t * producteurs = creer_acteurs(nombre_producteurs, production, tampon, limite); acteurs_t * consommateurs = creer_acteurs(nombre_consommateurs, consommation, tampon, limite); comptes_t comptes_production = bilan(producteurs); comptes_t comptes_consommation = bilan(consommateurs); printf("Bilan:\n\tNombre de valeurs produites : %llu\n" "\tSomme des valeurs produites : %llu\n" "\tNombre de valeurs consommées : %llu\n" "\tSomme des valeurs consommées : %llu\n", comptes_production.nombre, comptes_production.somme, comptes_consommation.nombre, comptes_consommation.somme); tampon = detruire_tampon(tampon); limite = detruire_limite(limite); producteurs = detruire_acteurs(producteurs); consommateurs = detruire_acteurs(consommateurs); return 0; }
/* fin de la session courante, et annonce du vainqueur */ void vainqueur(){ client_list *l = clients; char buffer[MAX_SIZE]; /* Annulation des threads de phase et de timer */ pthread_mutex_lock(&mutex_phase); pthread_cancel(tid_phase); pthread_cancel(tid_timer); set_phase("nulle"); pthread_mutex_unlock(&mutex_phase); /* Envoi du nom de vainqueur à tous les joueurs */ sprintf(buffer, "VAINQUEUR/%s/\n", bilan()); pthread_mutex_lock(&mutex_clients); while(l != NULL){ write(l->socket, buffer, strlen(buffer)); l = l->next; } pthread_mutex_unlock(&mutex_clients); }
/* tour donne le bilan de la session courant (tour courant; (joueur,score)) et l'enigme (position des robots et du point d'arrivé) */ void tour(){ client_list *aux = clients; char buffer[MAX_SIZE]; sleep(1); /* permet au client d'avoir le temps d'afficher le plateau avant le tour */ /* Incrementation du numero de tour */ pthread_mutex_lock(&mutex_tour); num_tour++; pthread_mutex_unlock(&mutex_tour); /* Génération d'une nouvelle énigme */ if (enigme != NULL) { free(enigme); } enigme = strdup(genererate_random_enigme()); sprintf(buffer, "TOUR/%s/%s/\n", enigme, bilan()); /* Remise à -1 de toutes les propositions d'enchères */ pthread_mutex_lock(&mutex_clients); while(aux != NULL){ aux->proposition = -1; write(aux->socket, buffer, strlen(buffer)); aux = aux->next; } pthread_mutex_unlock(&mutex_clients); /* Reinitialisation du boolean joueur_solution */ pthread_mutex_lock(&mutex_joueur_solution); joueur_solution = 0; pthread_mutex_unlock(&mutex_joueur_solution); /* Création d'une thread qui va gérer la phase de reflexion */ pthread_mutex_lock(&mutex_phase); if(pthread_create(&tid_phase, NULL, thread_reflexion, NULL) != 0){ perror("pthread_create thread_reflexion"); exit(1); } pthread_mutex_unlock(&mutex_phase); }