trace.c raw

   1  
   2  #include <stdio.h>
   3  #include <stdlib.h>
   4  
   5  #ifndef GC_DEBUG
   6  #  define GC_DEBUG
   7  #endif
   8  
   9  #include "gc.h"
  10  #include "gc/gc_backptr.h"
  11  
  12  #define CHECK_OUT_OF_MEMORY(p)            \
  13    do {                                    \
  14      if (NULL == (p)) {                    \
  15        fprintf(stderr, "Out of memory\n"); \
  16        exit(69);                           \
  17      }                                     \
  18    } while (0)
  19  
  20  struct treenode {
  21    struct treenode *x;
  22    struct treenode *y;
  23  };
  24  
  25  static struct treenode *root[10];
  26  
  27  static struct treenode *
  28  mktree(int i)
  29  {
  30    struct treenode *r = GC_NEW(struct treenode);
  31    struct treenode *x, *y;
  32  
  33    CHECK_OUT_OF_MEMORY(r);
  34    if (0 == i)
  35      return NULL;
  36    if (1 == i) {
  37      r = (struct treenode *)GC_MALLOC_ATOMIC(sizeof(struct treenode));
  38      CHECK_OUT_OF_MEMORY(r);
  39    }
  40    x = mktree(i - 1);
  41    y = mktree(i - 1);
  42    r->x = x;
  43    r->y = y;
  44    if (i != 1) {
  45      GC_END_STUBBORN_CHANGE(r);
  46      GC_reachable_here(x);
  47      GC_reachable_here(y);
  48    }
  49    return r;
  50  }
  51  
  52  int
  53  main(void)
  54  {
  55    int i;
  56  
  57    GC_INIT();
  58    if (GC_get_find_leak())
  59      printf("This test program is not designed for leak detection mode\n");
  60    for (i = 0; i < 10; ++i) {
  61      root[i] = mktree(12);
  62    }
  63    GC_generate_random_backtrace();
  64    GC_generate_random_backtrace();
  65    GC_generate_random_backtrace();
  66    GC_generate_random_backtrace();
  67    printf("SUCCEEDED\n");
  68    return 0;
  69  }
  70