clean: malloc small tiny dry

This commit is contained in:
gbrochar 2025-08-12 12:33:23 +02:00
parent 771d7fbce3
commit 9be740f2c0
1 changed files with 8 additions and 71 deletions

View File

@ -14,9 +14,7 @@ t_zone *create_new_zone(size_t size) {
return zone; return zone;
} }
void *malloc_tiny(size_t size) { void *malloc_block(size_t size, size_t zone_size, t_zone *zone) {
t_zone *zone = g_zones.tiny_zones;
while (1) { while (1) {
t_block *curr = zone->head; t_block *curr = zone->head;
if (curr == NULL) { if (curr == NULL) {
@ -27,16 +25,6 @@ void *malloc_tiny(size_t size) {
} }
zone->head = (t_block *)addr; zone->head = (t_block *)addr;
curr = zone->head; curr = zone->head;
/* ft_printf("addr of g_zones.tiny_zones : %p\n"
"addr of zone : %p\n"
"addr of *head %p\n"
"sizeof tzone : %d\n"
"size of tblock %d\n",
g_zones.tiny_zones,
zone,
curr,
sizeof(t_zone),
sizeof(t_block));*/
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
@ -53,7 +41,7 @@ void *malloc_tiny(size_t size) {
if ((addr + sizeof(t_block)) % 16 != 0) { if ((addr + sizeof(t_block)) % 16 != 0) {
addr += 16 - ((addr + sizeof(t_block)) % 16); addr += 16 - ((addr + sizeof(t_block)) % 16);
} }
if (((size_t)zone + g_zones.tiny_zone_size) - addr >= size + sizeof(t_block) + (16 - sizeof(t_block) % 16)) if (((size_t)zone + zone_size) - addr >= size + sizeof(t_block) + (16 - sizeof(t_block) % 16))
{ {
curr->next = (t_block *)addr; curr->next = (t_block *)addr;
curr = curr->next; curr = curr->next;
@ -64,7 +52,7 @@ void *malloc_tiny(size_t size) {
return (void *)((char *)curr + sizeof(t_block)); return (void *)((char *)curr + sizeof(t_block));
} }
if (zone->next == NULL) { if (zone->next == NULL) {
zone->next = create_new_zone(g_zones.tiny_zone_size); zone->next = create_new_zone(zone_size);
} }
zone = zone->next; zone = zone->next;
} }
@ -73,63 +61,12 @@ void *malloc_tiny(size_t size) {
return NULL; return NULL;
} }
void *malloc_small(size_t size) { void *malloc_tiny(size_t size) {
t_zone *zone = g_zones.small_zones; return malloc_block(size, g_zones.tiny_zone_size, g_zones.tiny_zones);
}
while (1) { void *malloc_small(size_t size) {
t_block *curr = zone->head; return malloc_block(size, g_zones.small_zone_size, g_zones.small_zones);
if (curr == NULL) {
// TODO size_t should be replaced by char * for pointer arithmetic
size_t addr = ((size_t)zone + sizeof(t_zone));
if ((addr + sizeof(t_block)) % 16 != 0) {
addr += 16 - ((addr + sizeof(t_block)) % 16);
}
zone->head = (t_block *)addr;
curr = zone->head;
/*ft_printf("addr of g_zones.small_zones : %p\n"
"addr of zone : %p\n"
"addr of *head %p\n"
"sizeof tzone : %d\n"
"size of tblock %d\n",
g_zones.small_zones,
zone,
curr,
sizeof(t_zone),
sizeof(t_block));*/
curr->size = size;
curr->free = 0;
curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)(curr) + sizeof(t_block));
}
else {
while (curr->next) {
// todo check if free and defrag
curr = curr->next;
}
// TODO size_t should be replaced by char * for pointer arithmetic
size_t addr = (size_t)curr + sizeof(t_block) + curr->size;
if ((addr + sizeof(t_block)) % 16 != 0) {
addr += 16 - ((addr + sizeof(t_block)) % 16);
}
if (((size_t)zone + g_zones.small_zone_size) - addr >= size + sizeof(t_block) + (16 - sizeof(t_block) % 16))
{
curr->next = (t_block *)addr;
curr = curr->next;
curr->size = size;
curr->free = 0;
curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)curr + sizeof(t_block));
}
if (zone->next == NULL) {
zone->next = create_new_zone(g_zones.small_zone_size);
}
zone = zone->next;
}
}
ft_printf("ITS A BIG MISTAKE IF IT EVER GOES THERE WHILE TRYING TO ALLOCATE A SMALL BLOCK THAT WOULD BE A HUGE BUMMER AND WOULD MAKE THE HEADLINES OF INTERNATIONAL NEWS FOR A WEEK\n");
return NULL;
} }
void *malloc_large(size_t size) { void *malloc_large(size_t size) {