#include #include #include #include /* Non standard include */ #include #include __thread void **shared_space; __thread volatile int cons_idx = 0; __thread volatile int prod_idx = 0; struct communication_assoc *create_comm_assoc(void) { struct communication_assoc *assoc; shared_space = (void **) malloc(SHARED_SPACE_SIZE); assoc = (struct communication_assoc *) malloc(sizeof(struct communication_assoc)); assoc->tid = pthread_self(); assoc->shared_space = shared_space; assoc->cons_idx = &cons_idx; assoc->prod_idx = &prod_idx; return assoc; } void reception(void (*on_receive)(void *)) { wait_initialization(); /* printf("Activate the consumer...\n"); */ while(cont) { struct communication_assoc *cur; discover_new_producers(); cur = assoc_root.next; while(cur != &assoc_root) { int cons_idx; for(cons_idx = *cur->cons_idx; cons_idx != *cur->prod_idx; cons_idx = (cons_idx + 1) % SHARED_SPACE_VOIDPTR, *cur->cons_idx = cons_idx) { void *tmp; tmp = cur->shared_space[cons_idx]; on_receive(tmp); } cur = cur->next; } } }