X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMBlock.c;h=b97f67b12a77938a7366bdbed8ed9659b7df4d95;hb=61ccfec175e1f51b2c89559faf91d9bee0b3b601;hp=60aa97b036eb57ef98bc17cec9291b371198118f;hpb=4bd153f2dd93745183584054e17c6ff169691a49;p=ghc-hetmet.git diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 60aa97b..b97f67b 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -52,10 +52,63 @@ lnat mblocks_allocated = 0; The MBlock Map: provides our implementation of HEAP_ALLOCED() -------------------------------------------------------------------------- */ -#ifdef MBLOCK_MAP_SIZE +#if SIZEOF_VOID_P == 4 StgWord8 mblock_map[MBLOCK_MAP_SIZE]; // initially all zeros +#elif SIZEOF_VOID_P == 8 +static MBlockMap dummy_mblock_map; +MBlockMap *mblock_cache = &dummy_mblock_map; +int mblock_map_count = 0; +MBlockMap **mblock_maps = NULL; + +static MBlockMap * +findMBlockMap(void *p) +{ + int i; + StgWord32 hi = (StgWord32) (((StgWord)p) >> 32); + for( i = 0; i < mblock_map_count; i++ ) + { + if(mblock_maps[i]->addrHigh32 == hi) + { + return mblock_maps[i]; + } + } + return NULL; +} + +StgBool +slowIsHeapAlloced(void *p) +{ + MBlockMap *map = findMBlockMap(p); + if(map) + { + mblock_cache = map; + return map->mblocks[MBLOCK_MAP_ENTRY(p)]; + } + else + return 0; +} #endif +static void +markHeapAlloced(void *p) +{ +#if SIZEOF_VOID_P == 4 + mblock_map[MBLOCK_MAP_ENTRY(p)] = 1; +#elif SIZEOF_VOID_P == 8 + MBlockMap *map = findMBlockMap(p); + if(map == NULL) + { + mblock_map_count++; + mblock_maps = realloc(mblock_maps, + sizeof(MBlockMap*) * mblock_map_count); + map = mblock_maps[mblock_map_count-1] = calloc(1,sizeof(MBlockMap)); + map->addrHigh32 = (StgWord32) (((StgWord)p) >> 32); + } + map->mblocks[MBLOCK_MAP_ENTRY(p)] = 1; + mblock_cache = map; +#endif +} + /* ----------------------------------------------------------------------------- Allocate new mblock(s) -------------------------------------------------------------------------- */ @@ -224,7 +277,7 @@ getMBlocks(nat n) // fill in the table for (i = 0; i < n; i++) { - MARK_HEAP_ALLOCED( ret + i * MBLOCK_SIZE ); + markHeapAlloced( ret + i * MBLOCK_SIZE ); } mblocks_allocated += n; @@ -333,7 +386,7 @@ getMBlocks(nat n) // fill in the table for (i = 0; i < n; i++) { - MARK_HEAP_ALLOCED ( ret + i * MBLOCK_SIZE ); + markHeapAlloced( ret + i * MBLOCK_SIZE ); } return ret;