-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmem_alloc.c
More file actions
71 lines (60 loc) · 1.43 KB
/
mem_alloc.c
File metadata and controls
71 lines (60 loc) · 1.43 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Copyright: Sima Alexandru (312CA) 2023
*/
#include <stdlib.h>
#include "mem_alloc.h"
#include "mem_prot.h"
/*
* Initializeaza un minibloc nou la adresa `address` si de dimensiune `size`.
*/
static miniblock_t *init_miniblock(const uint64_t address, const uint64_t size);
block_t *init_block(const uint64_t address, const uint64_t size)
{
block_t *block = malloc(sizeof(block_t));
if (!block)
return NULL;
block->size = size;
block->start_address = address;
miniblock_t *miniblock = init_miniblock(address, size);
if (!miniblock) {
free(block);
return NULL;
}
list_t *list = encapsulate(miniblock);
if (!list) {
free(block);
free(miniblock);
return NULL;
}
block->miniblock_list = list;
return block;
}
void free_miniblock_data(void *data)
{
miniblock_t *miniblock = data;
free(miniblock->rw_buffer);
free(data);
}
void free_block_data(void *data)
{
block_t *block = data;
list_t *list = block->miniblock_list;
clear_list(list, free_miniblock_data);
free(data);
}
static miniblock_t *init_miniblock(const uint64_t address, const uint64_t size)
{
miniblock_t *miniblock = malloc(sizeof(miniblock_t));
if (!miniblock)
return NULL;
miniblock->size = size;
miniblock->start_address = address;
// Seteaza permisiunile default.
miniblock->perm = PROT_READ | PROT_WRITE;
miniblock->rw_buffer = calloc(size, sizeof(char));
if (!miniblock->rw_buffer) {
free(miniblock);
return NULL;
}
return miniblock;
}