}
/**
- * \fn void *Heap_Extend(int Bytes)
* \brief Extend the size of the heap
*/
void *Heap_Extend(int Bytes)
// Bounds Check
if( (tVAddr)gHeapEnd + ((Bytes+0xFFF)&~0xFFF) > MM_KHEAP_MAX ) {
- Bytes = MM_KHEAP_MAX - (tVAddr)gHeapEnd;
+// Bytes = MM_KHEAP_MAX - (tVAddr)gHeapEnd;
return NULL;
}
}
/**
- * \fn void *Heap_Merge(tHeapHead *Head)
* \brief Merges two ajacent heap blocks
*/
void *Heap_Merge(tHeapHead *Head)
}
/**
- * \brief Allocate memory from the heap
* \param File Allocating source file
* \param Line Source line
- * \param Bytes Size of region to allocate
+ * \param __Bytes Size of region to allocate
*/
void *Heap_Allocate(const char *File, int Line, size_t __Bytes)
{
head->AllocateTime = now();
Mutex_Release(&glHeap); // Release spinlock
#if DEBUG_TRACE
- Debug("[Heap ] Malloc'd %p (%i bytes), returning to %p", head->Data, head->Size, __builtin_return_address(0));
+ Debug("[Heap ] Malloc'd %p (%i bytes), returning to %p",
+ head->Data, head->Size, __builtin_return_address(0));
#endif
return head->Data;
}
}
/**
- * \fn void Heap_Deallocate(void *Ptr)
* \brief Free an allocated memory block
*/
void Heap_Deallocate(void *Ptr)
// Sanity check
if((Uint)Ptr < (Uint)gHeapStart || (Uint)Ptr > (Uint)gHeapEnd)
{
- Log_Warning("Heap", "free - Passed a non-heap address (%p < %p < %p)\n",
- gHeapStart, Ptr, gHeapEnd);
+ Log_Warning("Heap", "free - Passed a non-heap address by %p (%p < %p < %p)\n",
+ __builtin_return_address(0), gHeapStart, Ptr, gHeapEnd);
return;
}
else
frag = 0;
Log_Log("Heap", "%i.%02i%% Heap Fragmentation", frag/100, frag%100);
- avgAlloc = (totalBytes-freeBytes)/(nBlocks-nFree);
+ if(nBlocks <= nFree)
+ avgAlloc = 0;
+ else
+ avgAlloc = (totalBytes-freeBytes)/(nBlocks-nFree);
if(avgAlloc != 0)
overhead = (sizeof(tHeapFoot)+sizeof(tHeapHead))*10000/avgAlloc;
else
// Scan and get distribution
#if 1
+ if(nBlocks > 0)
{
struct {
Uint Size;