blob: d3f6e44491df9c6cb72e894862ea045780a979de [file] [log] [blame]
sewardj8eb8bab2015-07-21 14:44:28 +00001#include "config.h"
2
florianc5325ef2013-09-17 20:15:36 +00003#define _GNU_SOURCE
florian49789512013-09-16 17:08:50 +00004#include <stdio.h>
5#include <pthread.h>
6#include <string.h>
7#include <stdlib.h>
sewardj8eb8bab2015-07-21 14:44:28 +00008#if defined(HAVE_SYS_PRCTL_H)
9#include <sys/prctl.h>
10#endif /* HAVE_SYS_PRCTL_H */
florian49789512013-09-16 17:08:50 +000011#include <sys/types.h>
12#include <unistd.h>
13#include <assert.h>
florianead018e2015-07-30 21:49:49 +000014#include "valgrind.h"
florian7e905102014-09-27 11:36:08 +000015
florian49789512013-09-16 17:08:50 +000016static pthread_t children[3];
17
18void bad_things(int offset)
19{
20 char* m = malloc(sizeof(char)*offset);
21 m[offset] = 0;
22 free(m);
23}
24
25void* child_fn_2 ( void* arg )
26{
27 const char* threadname = "012345678901234";
28
sewardj76ca27c2014-10-12 13:47:30 +000029# if !defined(VGO_darwin)
florian49789512013-09-16 17:08:50 +000030 pthread_setname_np(pthread_self(), threadname);
sewardj76ca27c2014-10-12 13:47:30 +000031# else
32 pthread_setname_np(threadname);
33# endif
florian49789512013-09-16 17:08:50 +000034
35 bad_things(4);
36
37 return NULL;
38}
39
40void* child_fn_1 ( void* arg )
41{
42 const char* threadname = "try1";
43 int r;
44
sewardj76ca27c2014-10-12 13:47:30 +000045# if !defined(VGO_darwin)
florian49789512013-09-16 17:08:50 +000046 pthread_setname_np(pthread_self(), threadname);
sewardj76ca27c2014-10-12 13:47:30 +000047# else
48 pthread_setname_np(threadname);
49# endif
florian49789512013-09-16 17:08:50 +000050
51 bad_things(3);
florianead018e2015-07-30 21:49:49 +000052 VALGRIND_PRINTF("%s", "I am in child_fn_1\n");
florian49789512013-09-16 17:08:50 +000053
54 r = pthread_create(&children[2], NULL, child_fn_2, NULL);
55 assert(!r);
56
57 r = pthread_join(children[2], NULL);
58 assert(!r);
59
60 return NULL;
61}
62
63void* child_fn_0 ( void* arg )
64{
65 int r;
66
67 bad_things(2);
68
69 r = pthread_create(&children[1], NULL, child_fn_1, NULL);
70 assert(!r);
71
72 r = pthread_join(children[1], NULL);
73 assert(!r);
74
75 return NULL;
76}
77
78int main(int argc, const char** argv)
79{
80 int r;
81
82 bad_things(1);
83
84 r = pthread_create(&children[0], NULL, child_fn_0, NULL);
85 assert(!r);
86
87 r = pthread_join(children[0], NULL);
88 assert(!r);
89
90 bad_things(5);
91
92 return 0;
93}
94