Пример #1
0
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;
}
Пример #2
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);
}
Пример #3
0
/* 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);
}