blob: b8a84b276c95d2a9e09ad02c035daa6e512eb4d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#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 = 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;
}
}
|