void * xHeap::AllocLarge(uint32 size, const char * filename, int line) { #else void * xHeap::AllocLarge(uint32 size) { #endif size = (size + ALIGN - 1 + sizeof(Block) + DUMMY_ID_SIZE) & ~(ALIGN - 1); Block * block = (Block *)MALLOC(size); if(!block) { return NULL; } #ifdef DEBUG_APP_HEAP block->filename = filename; block->line = line; #endif block->page = (uint16)-1; block->size = size; block->isFree = false; block->InsertBefore(dummyLargeBlock.next); largeStats.allocSize += size; uint32 dataSize = block->DataSize(); largeStats.RegisterAlloc(block->size, dataSize); uint8 * p = (uint8*)(block + 1); #ifndef USE_APP_HEAP_SAVING_MODE p[-1] = BT_LARGE; #else p[-1] &= ~BLOCK_TYPE_MASK; #endif #ifdef DEBUG_APP_HEAP *(int*)p = DUMMY_LARGE_USED_ID_PRE; p += sizeof(int); *(int*)(p + dataSize) = DUMMY_LARGE_USED_ID_POST; #endif MEMSET(p, 0, dataSize); #if defined(DEBUG_APP_HEAP) && defined(AEE_SIMULATOR) // CheckMemory(); #endif return p; }
void * xHeap::AllocMedium(uint32 size, const char * filename, int line) { #else void * xHeap::AllocMedium(uint32 size) { #endif #ifdef DEBUG_APP_HEAP // static int step = 0; // step++; #endif uint32 saveSize = size; size = (size + ALIGN - 1 + sizeof(Block) + DUMMY_ID_SIZE) & ~(ALIGN - 1); Block * block = dummyFree.nextFree; if(block->size < size) // block == &dummyFree => dummyFree.size == 0 { if(size > pageSize / 2) { #ifdef DEBUG_APP_HEAP return AllocLarge(saveSize, filename, line); #else return AllocLarge(saveSize); #endif } block = (Block*)MALLOC(pageSize); if(!block) { return NULL; } #ifdef DEBUG_APP_HEAP block->filename = filename; block->line = line; #endif block->page = nextPage++; block->size = pageSize; block->isFree = true; block->InsertBefore(dummyBlock.next); ((FreeBlock*)block)->InsertBeforeFreeLink(dummyFree.nextFree); mediumStats.allocSize += block->size; } else { mediumStats.hitCount++; #ifdef FIND_BEST_FREE_BLOCK for(FreeBlock * next = ((FreeBlock*)block)->nextFree; next->size >= size; ) { block = next; next = ((FreeBlock*)block)->nextFree; } #endif } block->size -= size; if(block->size < MAX_SMALL_SIZE && (block->size < MAX_SMALL_SIZE/2 || block->next->page != block->page)) { #ifdef DEBUG_APP_HEAP block->filename = filename; block->line = line; #endif block->size += size; ((FreeBlock*)block)->RemoveFreeLink(); } else { #ifdef DEBUG_APP_HEAP *(int*)(block+1) = DUMMY_MEDIUM_FREE_ID_PRE; *(int*)((uint8*)(block+1) + block->DataSize() + sizeof(int)) = DUMMY_MEDIUM_FREE_ID_POST; #endif if(block->size < ((FreeBlock*)block)->nextFree->size) { ((FreeBlock*)block)->RemoveFreeLink(); InsertFreeBlock((FreeBlock*)block); } ASSERT("Heap corrupted!" && (block->size & 3) == 0); Block * newBlock = (Block*)(((uint8*)block) + block->size); #ifdef DEBUG_APP_HEAP newBlock->filename = filename; newBlock->line = line; #endif newBlock->page = block->page; newBlock->size = size; newBlock->InsertAfter(block); block = newBlock; } block->isFree = false; uint32 dataSize = block->DataSize(); mediumStats.RegisterAlloc(block->size, dataSize); uint8 * p = (uint8*)(block+1); p[-1] = BT_MEDIUM; #ifdef DEBUG_APP_HEAP *(int*)p = DUMMY_MEDIUM_USED_ID_PRE; p += sizeof(int); *(int*)(p + dataSize) = DUMMY_MEDIUM_USED_ID_POST; #endif MEMSET(p, 0, dataSize); #if defined(DEBUG_APP_HEAP) && defined(AEE_SIMULATOR) // CheckMemory(); #endif return p; }