-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmalloc.c
111 lines (101 loc) · 2.47 KB
/
malloc.c
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
** malloc.c for in /home/jacqui_p/rendu/PSU_2016_malloc/
**
** Made by Pierre-Emmanuel Jacquier
** Login <[email protected]>
**
** Started on Mon Jan 30 10:57:50 2017 Pierre-Emmanuel Jacquier
** Last update Sat Feb 11 22:35:05 2017 Pierre-Emmanuel Jacquier
*/
#include <stdint.h>
#include "malloc.h"
t_memblock *g_head = NULL;
void *check_block(t_memblock *head, size_t size)
{
t_memblock *tmp;
if (!head)
return (NULL);
tmp = head;
while (tmp)
{
if (tmp->memsize >= size && tmp->isfree)
return (tmp);
tmp = tmp->next;
}
return (NULL);
}
void split_block(t_memblock *block, size_t size)
{
char *new_data_block;
size_t old_size;
if (block->memsize == size || (block->memsize - size) <= META_DATA_SIZE)
{
block->isfree = 0;
return ;
}
old_size = block->memsize;
new_data_block = (char *)block;
new_data_block += (size + META_DATA_SIZE);
((t_memblock *)new_data_block)->next = block->next;
((t_memblock *)new_data_block)->prev = block;
block->isfree = 0;
block->next = (t_memblock *)new_data_block;
block->next->isfree = 1;
block->memsize = size;
block->next->memsize = old_size - size - META_DATA_SIZE;
if (block->next->next)
block->next->next->prev = block->next;
}
void *add_block(t_memblock *head, size_t size)
{
t_memblock *tmp;
tmp = head;
if (!tmp)
{
tmp = sbrk(0);
if (sbrk(META_DATA_SIZE + size) == SBRK_ERROR)
return (NULL);
tmp->next = NULL;
tmp->prev = NULL;
tmp->memsize = size;
tmp->isfree = 0;
return (tmp);
}
while (tmp->next)
tmp = tmp->next;
tmp->next = sbrk(0);
if (sbrk(META_DATA_SIZE + size) == SBRK_ERROR)
return (NULL);
tmp->next->prev = tmp;
tmp->next->next = NULL;
tmp->next->memsize = size;
tmp->next->isfree = 0;
return (tmp->next);
}
void *malloc(size_t size)
{
t_memblock *block;
size_t alloc_size;
if (!size)
return (NULL);
if (size == SIZE_MAX)
return (NULL);
size = ALIGN_BLOCK(size);
alloc_size = ALIGN_TO_PAGESIZE(size);
block = NULL;
if (!g_head)
{
block = add_block(g_head, alloc_size);
split_block(block, size);
g_head = block;
return (block + 1);
}
if ((block = check_block(g_head, size)))
{
split_block(block, size);
return (block + 1);
}
block = add_block(g_head, alloc_size);
split_block(block, size);
return (block + 1);
}