Home | History | Annotate | Download | only in tests
      1 #define _GNU_SOURCE
      2 #include <stdio.h>
      3 #include <pthread.h>
      4 #include <string.h>
      5 #include <stdlib.h>
      6 #include <sys/types.h>
      7 #include <unistd.h>
      8 #include <assert.h>
      9 
     10 
     11 static pthread_t children[3];
     12 
     13 void bad_things(int offset)
     14 {
     15   char* m = malloc(sizeof(char)*offset);
     16   m[offset] = 0;
     17   free(m);
     18 }
     19 
     20 void* child_fn_2 ( void* arg )
     21 {
     22   const char* threadname = "012345678901234";
     23 
     24 #  if !defined(VGO_darwin)
     25   pthread_setname_np(pthread_self(), threadname);
     26 #  else
     27   pthread_setname_np(threadname);
     28 #  endif
     29 
     30   bad_things(4);
     31 
     32   return NULL;
     33 }
     34 
     35 void* child_fn_1 ( void* arg )
     36 {
     37   const char* threadname = "try1";
     38   int r;
     39 
     40 #  if !defined(VGO_darwin)
     41   pthread_setname_np(pthread_self(), threadname);
     42 #  else
     43   pthread_setname_np(threadname);
     44 #  endif
     45 
     46   bad_things(3);
     47 
     48   r = pthread_create(&children[2], NULL, child_fn_2, NULL);
     49   assert(!r);
     50 
     51   r = pthread_join(children[2], NULL);
     52   assert(!r);
     53 
     54   return NULL;
     55 }
     56 
     57 void* child_fn_0 ( void* arg )
     58 {
     59   int r;
     60 
     61   bad_things(2);
     62 
     63   r = pthread_create(&children[1], NULL, child_fn_1, NULL);
     64   assert(!r);
     65 
     66   r = pthread_join(children[1], NULL);
     67   assert(!r);
     68 
     69   return NULL;
     70 }
     71 
     72 int main(int argc, const char** argv)
     73 {
     74   int r;
     75 
     76   bad_things(1);
     77 
     78   r = pthread_create(&children[0], NULL, child_fn_0, NULL);
     79   assert(!r);
     80 
     81   r = pthread_join(children[0], NULL);
     82   assert(!r);
     83 
     84   bad_things(5);
     85 
     86   return 0;
     87 }
     88 
     89