X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStorage.c;h=911e4328e3d2d973bdc69bb15a92aadb01313ec9;hb=0abcbf0f5afda9cc067ddcf2c28b463d59d24a1e;hp=abf309a364475e053aac93166f46fda15a9ac3fd;hpb=ee5fde332eaece04469cf036c73df32277751f37;p=ghc-hetmet.git diff --git a/ghc/rts/Storage.c b/ghc/rts/Storage.c index abf309a..911e432 100644 --- a/ghc/rts/Storage.c +++ b/ghc/rts/Storage.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.c,v 1.63 2002/04/25 04:54:55 sof Exp $ + * $Id: Storage.c,v 1.69 2002/10/15 11:02:32 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -26,6 +26,9 @@ #include "RetainerProfile.h" // for counting memory blocks (memInventory) +#include +#include + #ifdef darwin_TARGET_OS #include unsigned long macho_etext = 0; @@ -45,7 +48,6 @@ static void macosx_get_memory_layout(void) StgClosure *caf_list = NULL; bdescr *small_alloc_list; /* allocate()d small objects */ -bdescr *large_alloc_list; /* allocate()d large objects */ bdescr *pinned_object_block; /* allocate pinned objects into this block */ nat alloc_blocks; /* number of allocate()d blocks since GC */ nat alloc_blocks_lim; /* approximate limit on alloc_blocks */ @@ -228,7 +230,6 @@ initStorage( void ) /* initialise the allocate() interface */ small_alloc_list = NULL; - large_alloc_list = NULL; alloc_blocks = 0; alloc_blocks_lim = RtsFlags.GcFlags.minAllocAreaSize; @@ -532,7 +533,15 @@ allocate( nat n ) lnat allocated_bytes( void ) { - return (alloc_blocks * BLOCK_SIZE_W - (alloc_HpLim - alloc_Hp)); + lnat allocated; + + allocated = alloc_blocks * BLOCK_SIZE_W - (alloc_HpLim - alloc_Hp); + if (pinned_object_block != NULL) { + allocated -= (pinned_object_block->start + BLOCK_SIZE_W) - + pinned_object_block->free; + } + + return allocated; } /* --------------------------------------------------------------------------- @@ -579,8 +588,9 @@ allocatePinned( nat n ) // we always return 8-byte aligned memory. bd->free must be // 8-byte aligned to begin with, so we just round up n to // the nearest multiple of 8 bytes. - ASSERT(((StgWord)bd->free & 7) == 0); - n = (n+7) & ~7; + if (sizeof(StgWord) == 4) { + n = (n+1) & ~1; + } // If we don't have a block of pinned objects yet, or the current // one isn't large enough to hold the new object, allocate a new one. @@ -617,10 +627,8 @@ stgAllocForGMP (size_t size_in_bytes) StgArrWords* arr; nat data_size_in_words, total_size_in_words; - /* should be a multiple of sizeof(StgWord) (whole no. of limbs) */ - ASSERT(size_in_bytes % sizeof(W_) == 0); - - data_size_in_words = size_in_bytes / sizeof(W_); + /* round up to a whole number of words */ + data_size_in_words = (size_in_bytes + sizeof(W_) + 1) / sizeof(W_); total_size_in_words = sizeofW(StgArrWords) + data_size_in_words; /* allocate and fill it in. */ @@ -825,9 +833,6 @@ memInventory(void) for (bd = small_alloc_list; bd; bd = bd->link) { total_blocks += bd->blocks; } - for (bd = large_alloc_list; bd; bd = bd->link) { - total_blocks += bd->blocks; - } #ifdef PROFILING if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_RETAINER) {