1#include "config.h"
2
3#define _GNU_SOURCE
4#include <stdio.h>
5#include <pthread.h>
6#include <string.h>
7#include <stdlib.h>
8#if defined(HAVE_SYS_PRCTL_H)
9#include <sys/prctl.h>
10#endif /* HAVE_SYS_PRCTL_H */
11#include <sys/types.h>
12#include <unistd.h>
13#include <assert.h>
14#include "valgrind.h"
15
16static 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
29#  if !defined(VGO_darwin)
30  pthread_setname_np(pthread_self(), threadname);
31#  else
32  pthread_setname_np(threadname);
33#  endif
34
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
45#  if !defined(VGO_darwin)
46  pthread_setname_np(pthread_self(), threadname);
47#  else
48  pthread_setname_np(threadname);
49#  endif
50
51  bad_things(3);
52  VALGRIND_PRINTF("%s", "I am in child_fn_1\n");
53
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
95