/*Initialisation des outils necessaires au fontionnement du thread*/ void commande_windows(arg_commande_windows_t* ipc) { statut = ipc->shm_statut; lot = ipc->shm_lot; entrepot = ipc->shm_entrepot; mtx_entrepot = ipc->entrepot; sem_erreur_palette = ipc->palette; sem_erreur_carton = ipc->carton; sem_AU = ipc->AU; sem_clapet = ipc->clapet; wait_order(my_socket); }
/* * contol read/write threads by handling global_run_operation */ void *rw_ctl_loop(int ctl_fd) { ssize_t rlen; char buf[HOST_MSG_SIZE]; int ret; /* Setup signal handlers */ signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); while (!global_sig_receive) { ret = wait_order(ctl_fd); if (ret < 0) break; rlen = read(ctl_fd, buf, sizeof(buf)); if (rlen < 0) { pr_err("read data error in ctl thread\n"); goto error; } if (rlen == 2 && buf[0] == '1') { /* * If host writes '1' to a control path, * this controller wakes all read/write threads. */ global_run_operation = true; pthread_cond_broadcast(&cond_wakeup); pr_debug("Wake up all read/write threads\n"); } else if (rlen == 2 && buf[0] == '0') { /* * If host writes '0' to a control path, read/write * threads will wait for notification from Host. */ global_run_operation = false; pr_debug("Stop all read/write threads\n"); } else pr_info("Invalid host notification: %s\n", buf); } return NULL; error: exit(EXIT_FAILURE); }