feat: free (untested)
This commit is contained in:
parent
912064ae31
commit
36dc194c28
1
main.c
1
main.c
|
@ -9,6 +9,7 @@ int main(int argc, char **argv) {
|
||||||
size = (rand() & 0x7ff) | 0xf00000;
|
size = (rand() & 0x7ff) | 0xf00000;
|
||||||
arr = (int *)ft_malloc(size * sizeof(int));
|
arr = (int *)ft_malloc(size * sizeof(int));
|
||||||
printf ("arr %d addr: %p arr size: %zu\n", i, arr, size);
|
printf ("arr %d addr: %p arr size: %zu\n", i, arr, size);
|
||||||
|
free(arr);
|
||||||
}
|
}
|
||||||
show_alloc_sizes();
|
show_alloc_sizes();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
27
src/free.c
27
src/free.c
|
@ -2,6 +2,31 @@
|
||||||
|
|
||||||
void free(void *ptr) {
|
void free(void *ptr) {
|
||||||
pthread_mutex_lock(&g_malloc_mutex);
|
pthread_mutex_lock(&g_malloc_mutex);
|
||||||
(void)ptr;
|
t_block *block = (t_block *)((char *)ptr - sizeof(t_block));
|
||||||
|
if (block->size < g_zones.small_block_max_size) {
|
||||||
|
block->free = 1;
|
||||||
|
} else {
|
||||||
|
t_block *curr = g_zones.large_blocks;
|
||||||
|
if (curr == NULL) {
|
||||||
|
pthread_mutex_unlock(&g_malloc_mutex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((char *)curr + sizeof(t_block) == (char *)ptr) {
|
||||||
|
g_zones.large_blocks = curr->next;
|
||||||
|
munmap((char *)ptr - sizeof(t_block) - (16 - sizeof(t_block) % 16), curr->size + sizeof(t_block) + (16 - sizeof(t_block) % 16));
|
||||||
|
pthread_mutex_unlock(&g_malloc_mutex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while ((char *)curr->next + sizeof(t_block) != (char *)ptr) {
|
||||||
|
curr = curr->next;
|
||||||
|
if (curr == NULL) {
|
||||||
|
pthread_mutex_unlock(&g_malloc_mutex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t_block *to_free = curr->next;
|
||||||
|
curr->next = curr->next->next;
|
||||||
|
munmap((char *)ptr - sizeof(t_block) - (16 - sizeof(t_block) % 16), to_free->size + sizeof(t_block) + (16 - sizeof(t_block) % 16));
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&g_malloc_mutex);
|
pthread_mutex_unlock(&g_malloc_mutex);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue