njn | 734b805 | 2007-11-01 04:40:37 +0000 | [diff] [blame] | 1 | #include <stdlib.h> |
| 2 | |
| 3 | #define nth_bit(x, n) ((x >> n) & 1) |
| 4 | #define Fn(N, Np1) \ |
| 5 | void* a##N(int x) { return ( nth_bit(x, N) ? a##Np1(x) : a##Np1(x) ); } |
| 6 | |
| 7 | // This test allocates a lot of heap memory, and every allocation features a |
| 8 | // different stack trace -- the stack traces are effectively a |
| 9 | // representation of the number 'i', where each function represents a bit in |
| 10 | // 'i', and if it's a 1 the first function is called, and if it's a 0 the |
| 11 | // second function is called. |
| 12 | |
| 13 | void* a999(int x) |
| 14 | { |
| 15 | return malloc(100); |
| 16 | } |
| 17 | |
| 18 | Fn(17, 999) |
| 19 | Fn(16, 17) |
| 20 | Fn(15, 16) |
| 21 | Fn(14, 15) |
| 22 | Fn(13, 14) |
| 23 | Fn(12, 13) |
| 24 | Fn(11, 12) |
| 25 | Fn(10, 11) |
| 26 | Fn( 9, 10) |
| 27 | Fn( 8, 9) |
| 28 | Fn( 7, 8) |
| 29 | Fn( 6, 7) |
| 30 | Fn( 5, 6) |
| 31 | Fn( 4, 5) |
| 32 | Fn( 3, 4) |
| 33 | Fn( 2, 3) |
| 34 | Fn( 1, 2) |
| 35 | Fn( 0, 1) |
| 36 | |
| 37 | int main(void) |
| 38 | { |
| 39 | int i; |
| 40 | |
| 41 | // Create a large XTree. |
| 42 | for (i = 0; i < (1 << 18); i++) |
| 43 | a0(i); |
| 44 | |
| 45 | // Do a lot of allocations so it gets dup'd a lot of times. |
| 46 | for (i = 0; i < 100000; i++) { |
| 47 | free(a1(234)); |
| 48 | free(a2(111)); |
| 49 | } |
| 50 | |
| 51 | return 0; |
| 52 | } |