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