1
2#include <pthread.h>
3#include <stdio.h>
4#include <stdlib.h>
5
6/* Simple test program, has a race.  Parent and child both modify y
7   with no locking.  This is the program shown in Fig 2 of the
8   original Eraser paper by Savage et al. */
9
10int y = 0, v = 0;
11pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
12
13void* child_fn ( void* arg )
14{
15   /* "Thread 2" in the paper */
16   pthread_mutex_lock( &mu );
17   v = v + 1;
18   pthread_mutex_unlock( &mu );
19   y = y + 1;
20   return NULL;
21}
22
23int main ( void )
24{
25   const struct timespec delay = { 0, 100 * 1000 * 1000 };
26   pthread_t child;
27   if (pthread_create(&child, NULL, child_fn, NULL)) {
28      perror("pthread_create");
29      exit(1);
30   }
31   nanosleep(&delay, 0);
32   /* "Thread 1" in the paper */
33   y = y + 1;
34   pthread_mutex_lock( &mu );
35   v = v + 1;
36   pthread_mutex_unlock( &mu );
37
38   if (pthread_join(child, NULL)) {
39      perror("pthread join");
40      exit(1);
41   }
42
43   return 0;
44}
45