#include "memorymanagement.h" #include "string.h" #include "kernel.h" void memory_manager_init( memory_manager_t *memory_manager, size_t offset, size_t size ) { memset( memory_manager, 0, sizeof( memory_manager_t ) ); memory_manager->offset = offset; memory_manager->size = size; memory_manager->free_ptr = memory_manager->offset; memory_manager->prev_ptr = 0xFFFFFFFF; } void memory_manager_init_with_buf( memory_manager_t *memory_manager, void *buf, size_t size ) { memset( memory_manager, 0, sizeof( memory_manager_t ) ); memory_manager->offset = (uint32_t)buf; memory_manager->size = size; memory_manager->free_ptr = memory_manager->offset; memory_manager->prev_ptr = 0xFFFFFFFF; } void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) { void *p = NULL; if( memory_manager->free_ptr - memory_manager->offset + size > memory_manager->size ) { kernel_panic( "Heap allocation out of memory (requested %d bytes, available %d)", size, size - ( memory_manager->free_ptr - memory_manager->offset ) ); } p = (void *)memory_manager->free_ptr; memory_manager->prev_ptr = memory_manager->free_ptr; memory_manager->free_ptr += size; return p; } void memory_manager_deallocate( memory_manager_t *memory_manager, void **p ) { if( *p == NULL ) { kernel_panic( "Double free of pointer 0x%X in heap", *p ); } // This actually doesn't work and we do it outside after free, when // a buffer has an optional semantic //*p = NULL; // are we freeing the previously allocated block, if yes, we can // adjust the free pointer if( (uint32_t)*p == memory_manager->prev_ptr ) { memory_manager->free_ptr = memory_manager->prev_ptr; memory_manager->prev_ptr = 0xFFFFFFFF; } }