#include #include #include #include /* Non standard include */ #include struct communication_assoc assoc_root; static pthread_mutex_t assoc_lock = PTHREAD_MUTEX_INITIALIZER; static struct communication_assoc assoc_tmp; static volatile int init = 0; volatile int cont = 1; void initialize_library(void) { assoc_tmp.prev = &assoc_tmp; assoc_tmp.next = &assoc_tmp; assoc_root.prev = &assoc_root; assoc_root.next = &assoc_root; } volatile int *init_comm(void) { return &cont; } void wait_initialization(void) { while (!init); } void add_sender(void) { struct communication_assoc *assoc; assoc = create_comm_assoc(); pthread_mutex_lock(&assoc_lock); if (!init) { initialize_library(); init = 1; } assoc->next = assoc_tmp.next; assoc_tmp.next->prev = assoc; assoc->prev = &assoc_tmp; assoc_tmp.next = assoc; pthread_mutex_unlock(&assoc_lock); } void remove_sender() { printf("remove_communication_channel: Not yet implemented\n"); } void discover_new_producers(void) { /* If there is some new thread for the write barrier */ if(&assoc_tmp != assoc_tmp.next) { /* printf("Adding a new set of producers\n"); */ pthread_mutex_lock(&assoc_lock); /* * list in assoc_tmp is inserted between assoc_root * and the first elements of assoc_root list */ assoc_root.next->prev = assoc_tmp.prev; assoc_tmp.prev->next = assoc_root.next; assoc_root.next = assoc_tmp.next; assoc_root.next->prev = &assoc_root; /* * assoc_tmp temporary list has been copied in * assoc_root list. assoc_tmp is now alone and so * double linked to itself */ assoc_tmp.prev = &assoc_tmp; assoc_tmp.next = &assoc_tmp; pthread_mutex_unlock(&assoc_lock); } }