1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Simple test program, has a race.  Parent and child both modify x
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   with no locking. */
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint x = 0;
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* child_fn ( void* arg )
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Unprotected relative to parent */
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x++;
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   const struct timespec delay = { 0, 100 * 1000 * 1000 };
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pthread_t child;
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (pthread_create(&child, NULL, child_fn, NULL)) {
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("pthread_create");
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   nanosleep(&delay, 0);
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Unprotected relative to child */
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x++;
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (pthread_join(child, NULL)) {
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("pthread join");
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
37