Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}