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