1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Simple test program, no race: parent only modified x after child
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   has modified it and then joined with the parent.  Tests simple
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   thread lifetime segment handling. */
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint x = 0;
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* child_fn ( void* arg )
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Unprotected relative to parent, but in child's segment only */
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x++;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return NULL;
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pthread_t child;
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x++; /* happens in parent's segment */
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (pthread_create(&child, NULL, child_fn, NULL)) {
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("pthread_create");
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (pthread_join(child, NULL)) {
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("pthread join");
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Now back in parent's segment */
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x++;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
40