summaryrefslogtreecommitdiff
path: root/src/kernel/memorymanagement.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-10 21:04:18 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-10 21:04:18 +0200
commit573b82fd2d46ebca7f98e5323e9f18e593a7996f (patch)
tree643d480130d1a6ac2639d63b384f43ca9cd82d83 /src/kernel/memorymanagement.c
parentea3afaaf2e1926328ca94fa1227c49631adaf5e7 (diff)
downloadabaos-573b82fd2d46ebca7f98e5323e9f18e593a7996f.tar.gz
abaos-573b82fd2d46ebca7f98e5323e9f18e593a7996f.tar.bz2
VGA Z-buffer is now dynamically allocated and freed
memory management can reuse the last pointer malloced if freed again
Diffstat (limited to 'src/kernel/memorymanagement.c')
-rw-r--r--src/kernel/memorymanagement.c15
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;
+ }
}