t_client *add_client(t_info *info, int server, int x, int y) { static int last_x = -1; static int last_y = -1; static int last_direction = -1; static int id = 0; t_client *client; client = xmalloc(sizeof(*client)); client->status = ST_NOT_LOGGED; client->fct_read = client_read; client->fct_write = client_write; init_buffer(client); client->level = START_LEVEL; client->x = (x ? x : get_random(info->x, last_x)); client->y = (y ? y : get_random(info->y, last_y)); last_x = client->x; last_y = client->y; push_list(&(info->zone[client->x][client->y].clients), client); client->direction = get_random(WEST, last_direction); client->team = NULL; init_ressources(client); push_list(&info->clients, (void *)client); if (server) client->socket = xaccept(server, NULL, NULL); client->id = id++; return (client); }
int main(int argc, char** argv) { Semaphore sem_dock; Semaphore mutex_dock; Semaphore sem_gen_v; Shm shm_dock; struct mq_attr attr1; struct mq_attr attr2; mqd_t mqd_trucks; mqd_t mqd_cars_vans; char mq1_name[MQ_NAME_LENGTH]; char mq2_name[MQ_NAME_LENGTH]; char* port_name = argv[1]; char* msg = malloc(sizeof(msg)); int dock_index; int nb_docks; int stop = 0; int num_read = 0; void *buffer; sscanf(argv[2], "%d", &dock_index); sscanf(argv[3], "%d", &nb_docks); init_ressources(&sem_dock, &mutex_dock, &shm_dock, port_name, dock_index, nb_docks); // Mise a zero des info de la Shm Dock dock; dock.index = dock_index; dock.boat_index = -1; wait_sem(mutex_dock); memcpy(shm_dock.pShm + (dock_index * sizeof(Dock)), &dock, sizeof(Dock)); signal_sem(mutex_dock); while (!stop) { // Attente d'un bateau printf("\t\t Quai %s %d > En attente %s\n", port_name, dock_index, sem_dock.semname); wait_sem(sem_dock); wait_sem(mutex_dock); memcpy(&dock, shm_dock.pShm + (dock_index * sizeof(Dock)), sizeof(Dock)); signal_sem(mutex_dock); sprintf(msg, "Bateau %d a quai", dock.boat_index); print_boat(port_name, dock_index, dock.boat_index, msg); // Ouverture MQ --- TODO: refactor with open_mq, ... sprintf(mq1_name, "%s%d", MQ_TRUCKS, dock.boat_index); sprintf(mq2_name, "%s%d", MQ_CARS_VANS, dock.boat_index); mqd_trucks = mq_open(mq1_name, O_RDONLY | O_NONBLOCK); mqd_cars_vans = mq_open(mq2_name, O_RDONLY | O_NONBLOCK); if (mqd_trucks == (mqd_t) -1 || mqd_cars_vans == (mqd_t) -1) { perror("Error when opening MQs (trucks, cars, vans)"); } if (mq_getattr(mqd_trucks, &attr1) == -1 || mq_getattr(mqd_cars_vans, &attr2) == -1) { perror("Erreur when mq_getattr\n"); } buffer = malloc(attr1.mq_msgsize); // Début du débarquement sprintf(msg, "Debut debarquement"); print_boat(port_name, dock_index, dock.boat_index, msg); // Débarquement des camions sprintf(msg, "Debarquement de %ld camions", attr1.mq_curmsgs); print_boat(port_name, dock_index, dock.boat_index, msg); if(attr1.mq_curmsgs > 0) { while(num_read != -1) { num_read = mq_receive(mqd_trucks, buffer, attr1.mq_msgsize, NULL); nanosleep((struct timespec[]){{0, 250000000}}, NULL); } } num_read = 0; // Débarquement des voitures/vans sprintf(msg, "Debarquement de %ld voitures/vans", attr2.mq_curmsgs); print_boat(port_name, dock_index, dock.boat_index, msg); if(attr2.mq_curmsgs > 0) { while(num_read != -1) { num_read = mq_receive(mqd_cars_vans, buffer, attr2.mq_msgsize, NULL); nanosleep((struct timespec[]){{0, 250000000}}, NULL); } }