diff options
Diffstat (limited to 'testsuite/tests/rts/testheapalloced.c')
-rw-r--r-- | testsuite/tests/rts/testheapalloced.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/testsuite/tests/rts/testheapalloced.c b/testsuite/tests/rts/testheapalloced.c new file mode 100644 index 0000000000..cc4dad40d4 --- /dev/null +++ b/testsuite/tests/rts/testheapalloced.c @@ -0,0 +1,100 @@ +#include "Rts.h" +#include "RtsFlags.h" +#ifdef DEBUG +#define INLINE_HEADER +#endif +#include "MBlock.h" +#ifdef DEBUG +extern void *getFirstMBlock(void); +extern void *getNextMBlock(void *mblock); +#endif + +#include <stdio.h> +#include <string.h> + +extern bdescr *allocGroup_lock_lock(nat n); +extern void freeGroup_lock(bdescr *p); + +const int ARRSIZE = 2000; +const int LOOPS = 20000; +const int MAXALLOC = ((8 * 1024 * 1024) / BLOCK_SIZE - 1); +//const int MAXALLOC = ((4 * 1024 * 1024) / BLOCK_SIZE - 1); +const int SEED = 0xf00f00; + +extern lnat mblocks_allocated; + +int main (int argc, char *argv[]) +{ + int i, j, b; + + bdescr *a[ARRSIZE]; + + srand(SEED); + + hs_init(&argc, &argv); + + memset(a, 0, ARRSIZE * sizeof(bdescr*)); + + for (i=0; i < LOOPS; i++) + { + j = rand() % ARRSIZE; + if (a[j]) { freeGroup_lock(a[j]); } + a[j] = allocGroup_lock(rand() % MAXALLOC + 1); + } + +#ifdef DEBUG + { + void *p; + i = 0; + for (p = getFirstMBlock(); p != NULL; p = getNextMBlock(p)) + { + if (!HEAP_ALLOCED(p)) barf("%p",p); + i++; + } + printf("%d\n", i); + } +#endif + + { + void *p, *base; + + j = 0; + base = RtsFlags.GcFlags.heapBase; + + for (i=0; i < LOOPS*2000; i++) + { + // this is for testing: generate random addresses anywhere + // in the address space. + // + // 48 bits is: 0x800000000000 - 0x7fffffffffff + // so ((StgInt)rand() >> 4) varies between -2^27 and 2^27-1. + // and << 20 of this is a random signed 48-bit megablock address + // + // p = (void*)((StgWord)((StgInt)rand() >> 4) << 20); + + // this is for benchmarking: roughly half of these + // addresses will be in the heap. + p = base + (((StgWord)rand() << 10) % + ((StgWord)ARRSIZE * MAXALLOC * BLOCK_SIZE)); + + if (HEAP_ALLOCED(p)) { + // printf("%p\n",p); + j++; + } + } + printf("%d\n", j); + } + + printf("misses: %ld, %ld%\n", mpc_misses, mpc_misses / (LOOPS*20)); + + for (i=0; i < ARRSIZE; i++) + { + if (a[i]) { freeGroup_lock(a[i]); } + } + + hs_exit(); // will do a memory leak test + + exit(0); +} + +// 48 bits is: 0x800000000000 - 0x7fffffffffff |