1b411202f9ff33a587558e2e836626bc7eb9db183sewardj 2b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <pthread.h> 3b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdio.h> 4b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdlib.h> 5b411202f9ff33a587558e2e836626bc7eb9db183sewardj 6b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Simple test program, has two races. A happens-before detector can only 7d024ae5ca3949fa1fa9bee62825c4e0d2bda31e3sewardj ever detect one of them, though. XXX: apparently not so; Drd and H 3.4 detect both. */ 8b411202f9ff33a587558e2e836626bc7eb9db183sewardj 9b411202f9ff33a587558e2e836626bc7eb9db183sewardjint unprot1 = 0, unprot2 = 0, prot = 0; 10b411202f9ff33a587558e2e836626bc7eb9db183sewardjpthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER; 11b411202f9ff33a587558e2e836626bc7eb9db183sewardj 12b411202f9ff33a587558e2e836626bc7eb9db183sewardjvoid* child_fn ( void* arg ) 13b411202f9ff33a587558e2e836626bc7eb9db183sewardj{ 14b411202f9ff33a587558e2e836626bc7eb9db183sewardj unprot1 ++; 15b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutex_lock( &mu ); 16b411202f9ff33a587558e2e836626bc7eb9db183sewardj prot ++; 17b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutex_unlock( &mu ); 18b411202f9ff33a587558e2e836626bc7eb9db183sewardj unprot2 ++; 19b411202f9ff33a587558e2e836626bc7eb9db183sewardj return NULL; 20b411202f9ff33a587558e2e836626bc7eb9db183sewardj} 21b411202f9ff33a587558e2e836626bc7eb9db183sewardj 22b411202f9ff33a587558e2e836626bc7eb9db183sewardjint main ( void ) 23b411202f9ff33a587558e2e836626bc7eb9db183sewardj{ 24b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_t child; 25b411202f9ff33a587558e2e836626bc7eb9db183sewardj 26b411202f9ff33a587558e2e836626bc7eb9db183sewardj if (pthread_create(&child, NULL, child_fn, NULL)) { 27b411202f9ff33a587558e2e836626bc7eb9db183sewardj perror("pthread_create"); 28b411202f9ff33a587558e2e836626bc7eb9db183sewardj exit(1); 29b411202f9ff33a587558e2e836626bc7eb9db183sewardj } 30b411202f9ff33a587558e2e836626bc7eb9db183sewardj 31b411202f9ff33a587558e2e836626bc7eb9db183sewardj unprot1 ++; 32b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutex_lock( &mu ); 33b411202f9ff33a587558e2e836626bc7eb9db183sewardj prot ++; 34b411202f9ff33a587558e2e836626bc7eb9db183sewardj pthread_mutex_unlock( &mu ); 35b411202f9ff33a587558e2e836626bc7eb9db183sewardj unprot2 ++; 36b411202f9ff33a587558e2e836626bc7eb9db183sewardj 37b411202f9ff33a587558e2e836626bc7eb9db183sewardj if (pthread_join(child, NULL)) { 38b411202f9ff33a587558e2e836626bc7eb9db183sewardj perror("pthread join"); 39b411202f9ff33a587558e2e836626bc7eb9db183sewardj exit(1); 40b411202f9ff33a587558e2e836626bc7eb9db183sewardj } 41b411202f9ff33a587558e2e836626bc7eb9db183sewardj 42b411202f9ff33a587558e2e836626bc7eb9db183sewardj return 0; 43b411202f9ff33a587558e2e836626bc7eb9db183sewardj} 44