Home | History | Annotate | Download | only in tests
      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 
     16 static pthread_t children[3];
     17 
     18 void bad_things(int offset)
     19 {
     20   char* m = malloc(sizeof(char)*offset);
     21   m[offset] = 0;
     22   free(m);
     23 }
     24 
     25 void* 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 
     40 void* 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 
     63 void* 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 
     78 int 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