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