1 /*
2  * Creates 8 threads. The fifth one (counting the main thread as well)
3  * causes a core dump.
4  */
5 
6 #include <errno.h>
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 
13 #define NEVERENDING_SLEEP 10000
14 
15 static pthread_barrier_t barrier;
16 
thread_func2(void * arg)17 static void *thread_func2(void *arg) {
18    pthread_barrier_wait(&barrier);
19    sleep(NEVERENDING_SLEEP);
20    return NULL;
21 }
22 
thread_func3(void * arg)23 static void *thread_func3(void *arg) {
24    pthread_barrier_wait(&barrier);
25    sleep(NEVERENDING_SLEEP);
26    return NULL;
27 }
28 
thread_func4(void * arg)29 static void *thread_func4(void *arg) {
30    pthread_barrier_wait(&barrier);
31    sleep(NEVERENDING_SLEEP);
32    return NULL;
33 }
34 
thread_func5(void * arg)35 static void *thread_func5(void *arg) {
36    pthread_barrier_wait(&barrier);
37    sleep(2);
38 
39    char *x = (char *) 0x1;
40    *x = 2;
41    return NULL;
42 }
43 
thread_func6(void * arg)44 static void *thread_func6(void *arg) {
45    pthread_barrier_wait(&barrier);
46    sleep(NEVERENDING_SLEEP);
47    return NULL;
48 }
49 
thread_func7(void * arg)50 static void *thread_func7(void *arg) {
51    pthread_barrier_wait(&barrier);
52    sleep(NEVERENDING_SLEEP);
53    return NULL;
54 }
55 
thread_func8(void * arg)56 static void *thread_func8(void *arg) {
57    pthread_barrier_wait(&barrier);
58    sleep(NEVERENDING_SLEEP);
59    return NULL;
60 }
61 
thread_func9(void * arg)62 static void *thread_func9(void *arg) {
63    pthread_barrier_wait(&barrier);
64    sleep(NEVERENDING_SLEEP);
65    return NULL;
66 }
67 
create_thread(void * (* thread_func)(void *))68 static void create_thread(void *(*thread_func)(void *))
69 {
70    pthread_t thread;
71 
72    int ret = pthread_create(&thread, NULL, thread_func, NULL);
73    if (ret != 0) {
74       fprintf(stderr, "pthread_create: %s (%d)\n", strerror(ret), ret);
75       exit(1);
76    }
77 }
78 
main(int argc,const char * argv[])79 int main(int argc, const char *argv[])
80 {
81    int ret = pthread_barrier_init(&barrier, NULL, 9);
82    if (ret != 0) {
83       fprintf(stderr, "pthread_barrier_init: %s (%d)\n",
84               strerror(ret), ret);
85       exit(1);
86    }
87 
88    create_thread(thread_func2);
89    create_thread(thread_func3);
90    create_thread(thread_func4);
91    create_thread(thread_func5);
92    create_thread(thread_func6);
93    create_thread(thread_func7);
94    create_thread(thread_func8);
95    create_thread(thread_func9);
96    pthread_barrier_wait(&barrier);
97 
98    sleep(NEVERENDING_SLEEP);
99    return 0;
100 }
101