1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team 1998-2007
5 * MegaBlock Allocator Interface. This file contains all the dirty
6 * architecture-dependent hackery required to get a chunk of aligned
7 * memory from the operating system.
9 * ---------------------------------------------------------------------------*/
11 #include "PosixSource.h"
16 #include "BlockAlloc.h"
20 lnat mblocks_allocated = 0;
28 /* -----------------------------------------------------------------------------
29 The MBlock Map: provides our implementation of HEAP_ALLOCED()
30 -------------------------------------------------------------------------- */
32 #if SIZEOF_VOID_P == 4
33 StgWord8 mblock_map[MBLOCK_MAP_SIZE]; // initially all zeros
34 #elif SIZEOF_VOID_P == 8
35 static MBlockMap dummy_mblock_map;
36 MBlockMap *mblock_cache = &dummy_mblock_map;
37 int mblock_map_count = 0;
38 MBlockMap **mblock_maps = NULL;
41 findMBlockMap(void *p)
44 StgWord32 hi = (StgWord32) (((StgWord)p) >> 32);
45 for( i = 0; i < mblock_map_count; i++ )
47 if(mblock_maps[i]->addrHigh32 == hi)
49 return mblock_maps[i];
56 slowIsHeapAlloced(void *p)
58 MBlockMap *map = findMBlockMap(p);
62 return map->mblocks[MBLOCK_MAP_ENTRY(p)];
70 markHeapAlloced(void *p)
72 #if SIZEOF_VOID_P == 4
73 mblock_map[MBLOCK_MAP_ENTRY(p)] = 1;
74 #elif SIZEOF_VOID_P == 8
75 MBlockMap *map = findMBlockMap(p);
79 mblock_maps = realloc(mblock_maps,
80 sizeof(MBlockMap*) * mblock_map_count);
81 map = mblock_maps[mblock_map_count-1] = calloc(1,sizeof(MBlockMap));
82 map->addrHigh32 = (StgWord32) (((StgWord)p) >> 32);
84 map->mblocks[MBLOCK_MAP_ENTRY(p)] = 1;
89 /* -----------------------------------------------------------------------------
90 Allocate new mblock(s)
91 -------------------------------------------------------------------------- */
99 // The external interface: allocate 'n' mblocks, and return the
108 ret = osGetMBlocks(n);
110 debugTrace(DEBUG_gc, "allocated %d megablock(s) at %p",n,ret);
113 for (i = 0; i < n; i++) {
114 markHeapAlloced( ret + i * MBLOCK_SIZE );
117 mblocks_allocated += n;