void* run_a_baboons(void* thread_id) { //unsigned short xsubi[3]; // print_thread_info("About to start", "A to B", thread_id); sleep_rand(1000); sem_wait(&mutex); if ((curr_dir == a_to_b || curr_dir == none) && xing_count < 5 && (xed_count + xing_count) < 10) { curr_dir = a_to_b; xing_count++; sem_post(&mutex); } else { //print_thread_info("Waiting to cross", "B to A", thread_id); to_b_wait_count++; sem_post(&mutex); sem_wait(&to_b); to_b_wait_count--; xing_count++; curr_dir = a_to_b; sem_post(&mutex); } int valp; sem_getvalue(&mutex, &valp); //fprintf(stderr, "thread id: %d, mutex: %d\n", *((int*)thread_id), valp); print_thread_info("Crossing", "A to B", thread_id); sleep_rand(10000); print_thread_info("Done crossing", "A to B", thread_id); sem_getvalue(&mutex, &valp); //fprintf(stderr, "thread id: %d, mutex: %d\n", *((int*)thread_id), valp); sem_wait(&mutex); xed_count++; xing_count--; if (xing_count > 0 && xing_count <= 4 && (((xed_count + xing_count) < 10 && to_b_wait_count == 0) || ((xed_count + xing_count) >= 10 && to_a_wait_count != 0))) { sem_post(&mutex); } else if (xing_count >= 0 && xing_count <= 4 && (((xed_count + xing_count) < 10 && to_b_wait_count != 0) || ((xed_count+xing_count) >= 10 && to_a_wait_count == 0 && to_b_wait_count != 0))) { sem_post(&to_b); } else if ((xing_count == 0 && (((xed_count + xing_count) < 10 && to_b_wait_count == 0 && to_a_wait_count != 0) || ((xed_count+xing_count) >= 10 && to_a_wait_count != 0)))) { curr_dir = b_to_a; xed_count = 0; sem_post(&to_a); } else if (xing_count == 0 && to_b_wait_count == 0 && to_a_wait_count == 0) { curr_dir = none; xed_count = 0; sem_post(&mutex); } else { print_thread_info("ERROR", "A to B", thread_id); fprintf(stderr, "xed_count: %d, xing_count: %d, to_a: %d, to_b: %d, xing_dir: %d\n", xed_count, xing_count, to_a_wait_count, to_b_wait_count, curr_dir); exit(1); } pthread_exit(0); return NULL; }
static int __init print_thread_info_init(void) { print_thread_info(PID); return 0; }