#include #include #include #include /* Non standard include */ #include #include struct thread_comm *tcomms; volatile int cont = 1; static int init = 0; static pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t init_cond = PTHREAD_COND_INITIALIZER; int init_library(void) { tcomms = (struct thread_comm *) malloc(nb_prod * sizeof(struct thread_comm)); if (tcomms == NULL) { fprintf(stderr, "Failed to allocate %lu bytes needed by the library to work\n", nb_prod * sizeof(struct thread_comm)); return -1; } return 0; } int get_thread_number(void) { static int i = 0; static pthread_mutex_t i_lock = PTHREAD_MUTEX_INITIALIZER; int i_local; pthread_mutex_lock(&i_lock); i_local = i; i++; pthread_mutex_unlock(&i_lock); return i_local; } void init_producer_thread(void) { static int i = 0; static pthread_mutex_t i_lock = PTHREAD_MUTEX_INITIALIZER; int i_local; pthread_mutex_lock(&i_lock); i_local = i; i++; pthread_mutex_unlock(&i_lock); init_thread_comm(&tcomms[i_local]); pthread_mutex_lock(&init_lock); init = 1; pthread_cond_signal(&init_cond); pthread_mutex_unlock(&init_lock); } void wait_initialization(void) { pthread_mutex_lock(&init_lock); if (!init) pthread_cond_wait(&init_cond, &init_lock); pthread_mutex_unlock(&init_lock); }