*
* \brief Heap subsystem (public interface).
*
- * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
*/
/*
* This function prototype is deprecated, will change in:
* void heap_init(struct Heap* h, heap_buf_t* memory, size_t size)
- * in the nex BeRTOS release.
+ * in the next BeRTOS release.
*/
void heap_init(struct Heap* h, void* memory, size_t size)
{
memset(memory, FREE_FILL_CODE, size);
#endif
- ASSERT2((((uintptr_t)memory % sizeof(heap_buf_t)) == 0),
+ ASSERT2(((size_t)memory % alignof(heap_buf_t)) == 0,
"memory buffer is unaligned, please use the HEAP_DEFINE_BUF() macro to declare heap buffers!\n");
/* Initialize heap with a single big chunk */
if (!size)
size = sizeof(MemChunk);
- /* Special case: first chunk in the free list */
+ /* Special cases: first chunk in the free list or memory completely full */
ASSERT((uint8_t*)mem != (uint8_t*)h->FreeList);
- if (((uint8_t *)mem) < ((uint8_t *)h->FreeList))
+ if (((uint8_t *)mem) < ((uint8_t *)h->FreeList) || !h->FreeList)
{
/* Insert memory block before the current free list head */
prev = (MemChunk *)mem;
}
}
+/**
+ * Returns the number of free bytes in a heap.
+ * \param h the heap to check.
+ *
+ * \note The returned value is the sum of all free memory regions
+ * in the heap.
+ * Those regions are likely to be *not* contiguous,
+ * so a successive allocation may fail even if the
+ * requested amount of memory is lower than the current free space.
+ */
+size_t heap_freeSpace(struct Heap *h)
+{
+ size_t free_mem = 0;
+ for (MemChunk *chunk = h->FreeList; chunk; chunk = chunk->next)
+ free_mem += chunk->size;
+
+ return free_mem;
+}
+
#if CONFIG_HEAP_MALLOC
+/**
+ * Standard malloc interface
+ */
void *heap_malloc(struct Heap* h, size_t size)
{
size_t *mem;
return mem;
}
+/**
+ * Standard calloc interface
+ */
void *heap_calloc(struct Heap* h, size_t size)
{
void *mem;