if(head->Size == Bytes) {
head->Magic = MAGIC_USED;
RELEASE(&giHeapSpinlock); // Release spinlock
+ LOG("RETURN %p", best->Data);
return best->Data;
}
// Check size
if(best->Size == Bytes) {
RELEASE(&giHeapSpinlock); // Release spinlock
+ LOG("RETURN %p", best->Data);
return best->Data;
}
}
best->Magic = MAGIC_USED; // Mark block as used
RELEASE(&giHeapSpinlock); // Release spinlock
+ LOG("RETURN %p", best->Data);
return best->Data;
}
tHeapHead *head;
tHeapFoot *foot;
+ LOG("Ptr = %p", Ptr);
+ LOG("Returns to %p", __builtin_return_address(0));
+
// Alignment Check
if( (Uint)Ptr & (sizeof(Uint)-1) ) {
Warning("free - Passed a non-aligned address (%p)\n", Ptr);
return NULL;
}
+/**
+ * \fn int IsHeap(void *Ptr)
+ * \brief Checks if an address is a heap address
+ */
+int IsHeap(void *Ptr)
+{
+ tHeapHead *head;
+ if((Uint)Ptr < (Uint)gHeapStart) return 0;
+ if((Uint)Ptr > (Uint)gHeapEnd) return 0;
+
+ head = (void*)( (Uint)Ptr - sizeof(tHeapHead) );
+ if(head->Magic != MAGIC_USED && head->Magic != MAGIC_FREE)
+ return 0;
+
+ return 1;
+}
+
#if WARNINGS
void Heap_Dump()
{