diff options
Diffstat (limited to 'src/kernel/memorymanagement.c')
-rw-r--r-- | src/kernel/memorymanagement.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/kernel/memorymanagement.c b/src/kernel/memorymanagement.c index dc2d160..b8a84b2 100644 --- a/src/kernel/memorymanagement.c +++ b/src/kernel/memorymanagement.c @@ -11,6 +11,7 @@ void memory_manager_init( memory_manager_t *memory_manager, size_t offset, size_ memory_manager->offset = offset; memory_manager->size = size; memory_manager->free_ptr = offset; + memory_manager->prev_ptr = 0xFFFFFFFF; } void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) @@ -19,10 +20,11 @@ void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) 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 ) - 1 ); + 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; @@ -34,7 +36,16 @@ void memory_manager_deallocate( memory_manager_t *memory_manager, void **p ) kernel_panic( "Double free of pointer 0x%X in heap", *p ); } - *p = NULL; + // 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; + } } |