1 #define _XOPEN_SOURCE 600
2 #define _BSD_SOURCE
3 #define _GNU_SOURCE
4 
5 #include <stdio.h>
6 
7 #include <sched.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include "tests/sys_mman.h"
11 #include <sys/syscall.h>
12 #include <sys/wait.h>
13 #include <unistd.h>
14 
15 #include "valgrind.h"
16 
17 #define STACK_SIZE 8192
18 
19 #ifndef CLONE_THREAD
20 #define CLONE_THREAD	0x00010000	/* Same thread group? */
21 #endif
22 
thread_main(void * arg)23 static int thread_main(void *arg)
24 {
25    char buffer[1024];
26 
27    memset( buffer, 1, sizeof( buffer ) );
28 
29    sleep(2); /* ppc64-linux hack */
30    return memchr( buffer, 1, sizeof( buffer ) ) == NULL;
31 }
32 
main(int argc,char ** argv)33 int main(int argc, char **argv)
34 {
35    void *stack;
36    int stackid __attribute__((unused));
37    pid_t pid;
38 
39    /* "2*" is a ppc64-linux hack */
40    if ( ( stack = mmap( NULL, 2* STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 ) ) == MAP_FAILED )
41    {
42       perror( "mmap" );
43       exit( 1 );
44    }
45 
46    stackid = VALGRIND_STACK_REGISTER( stack, stack + STACK_SIZE );
47 
48    if ( ( pid = clone( thread_main, stack + STACK_SIZE, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|SIGCHLD, NULL ) ) == -1 )
49    {
50       perror( "clone" );
51       exit( 1 );
52    }
53 
54    sleep( 1 );
55 
56    exit( 0 );
57 }
58