Example #1
0
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;
}