1 /* Unit test for drd that triggers a race on the use of a POSIX condition 2 variable. By Bart Van Assche. 3 */ 4 5 #include <assert.h> 6 #include <stdio.h> // printf() 7 #include <pthread.h> 8 #include <unistd.h> // usleep() 9 10 11 // Local functions declarations. 12 13 static void* thread_func(void* thread_arg); 14 15 16 // Local variables. 17 18 static pthread_mutex_t s_mutex; 19 static pthread_cond_t s_cond; 20 static int s_use_mutex = 0; 21 22 23 // Function definitions. 24 25 int main(int argc, char** argv) 26 { 27 int optchar; 28 pthread_t threadid; 29 30 while ((optchar = getopt(argc, argv, "m")) != EOF) 31 { 32 switch (optchar) 33 { 34 case 'm': 35 s_use_mutex = 1; 36 break; 37 default: 38 assert(0); 39 } 40 } 41 42 pthread_cond_init(&s_cond, 0); 43 pthread_mutex_init(&s_mutex, 0); 44 pthread_mutex_lock(&s_mutex); 45 46 pthread_create(&threadid, 0, thread_func, 0); 47 48 pthread_cond_wait(&s_cond, &s_mutex); 49 pthread_mutex_unlock(&s_mutex); 50 51 pthread_join(threadid, 0); 52 53 pthread_mutex_destroy(&s_mutex); 54 pthread_cond_destroy(&s_cond); 55 56 return 0; 57 } 58 59 static void* thread_func(void* thread_arg) 60 { 61 // Wait until the main thread has entered pthread_cond_wait(). 62 pthread_mutex_lock(&s_mutex); 63 pthread_mutex_unlock(&s_mutex); 64 65 // Signal the condition variable. 66 if (s_use_mutex) pthread_mutex_lock(&s_mutex); 67 pthread_cond_signal(&s_cond); 68 if (s_use_mutex) pthread_mutex_unlock(&s_mutex); 69 70 return 0; 71 } 72