chore: upload save

This commit is contained in:
gbrochar 2025-07-17 12:28:27 +02:00
parent 00f1d503c1
commit 4121fcd7fd
6 changed files with 45 additions and 22 deletions

3
any_test.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
make
LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so $@

View File

@ -5,6 +5,7 @@
# include <unistd.h> # include <unistd.h>
# include <sys/mman.h> # include <sys/mman.h>
# include <pthread.h> # include <pthread.h>
# include <stdarg.h>
// TODO Remove me (printf) // TODO Remove me (printf)
# include <stdio.h> # include <stdio.h>
@ -40,6 +41,7 @@ typedef struct s_zones {
extern pthread_mutex_t g_malloc_mutex; extern pthread_mutex_t g_malloc_mutex;
extern t_zones g_zones; extern t_zones g_zones;
size_t malloc_usable_size(void *ptr);
void *malloc(size_t size); void *malloc(size_t size);
void free(void *ptr); void free(void *ptr);
void *realloc(void *ptr, size_t size); void *realloc(void *ptr, size_t size);

View File

@ -1,46 +1,40 @@
#include "malloc.h" #include "malloc.h"
void free(void *ptr) { void free(void *ptr) {
write(1, "free\n", 5); ft_printf("free %p\n", ptr);
pthread_mutex_lock(&g_malloc_mutex); pthread_mutex_lock(&g_malloc_mutex);
write(1, "free\n", 5);
if (ptr == NULL) { if (ptr == NULL) {
ft_printf("free null\n"); ft_printf("free null\n");
pthread_mutex_unlock(&g_malloc_mutex); pthread_mutex_unlock(&g_malloc_mutex);
return; return;
} }
t_block *block = (t_block *)((char *)ptr - sizeof(t_block)); t_block *block = (t_block *)((char *)ptr - sizeof(t_block));
write(1, "free\n", 5);
if (block->size < g_zones.small_block_max_size) { if (block->size < g_zones.small_block_max_size) {
write(1, "rree\n", 5);
block->free = 1; block->free = 1;
} else { } else {
write(1, "1\n", 2);
t_block *curr = g_zones.large_blocks; t_block *curr = g_zones.large_blocks;
if (curr == NULL) { if (curr == NULL) {
write(1, "E\n", 2);
pthread_mutex_unlock(&g_malloc_mutex); pthread_mutex_unlock(&g_malloc_mutex);
return; return;
} }
if ((char *)curr + sizeof(t_block) == (char *)ptr) { if ((char *)curr + sizeof(t_block) == (char *)ptr) {
write(1, "2\n", 2);
g_zones.large_blocks = curr->next; 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)); 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); pthread_mutex_unlock(&g_malloc_mutex);
return; return;
} }
while ((char *)curr->next + sizeof(t_block) != (char *)ptr) { while ((char *)curr->next + sizeof(t_block) != (char *)ptr) {
curr = curr->next; curr = curr->next;
if (curr == NULL) { if (curr == NULL) {
write(1, "e\n", 2); write(1, "e\n", 2);
pthread_mutex_unlock(&g_malloc_mutex); pthread_mutex_unlock(&g_malloc_mutex);
return; return;
} }
} }
write(1, "3\n", 2);
t_block *to_free = curr->next; t_block *to_free = curr->next;
curr->next = curr->next->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)); 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);
} }

View File

@ -30,3 +30,9 @@ static void init_malloc(void) {
g_zones.large_blocks = NULL; g_zones.large_blocks = NULL;
} }
__attribute__((destructor))
static void dest_malloc(void) {
ft_printf("Destructor called\n");
show_alloc_mem();
}

View File

@ -4,7 +4,7 @@ t_zone *create_new_tiny_zone(void) {
t_zone *zone; t_zone *zone;
// TODO protect mmap // TODO protect mmap
zone = (t_zone *)mmap(NULL, g_zones.tiny_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); zone = (t_zone *)mmap(NULL, g_zones.tiny_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
zone->head = NULL; zone->head = NULL;
zone->next = NULL; zone->next = NULL;
return zone; return zone;
} }
@ -22,7 +22,7 @@ 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" /* ft_printf("addr of g_zones.tiny_zones : %p\n"
"addr of zone : %p\n" "addr of zone : %p\n"
"addr of *head %p\n" "addr of *head %p\n"
"sizeof tzone : %d\n" "sizeof tzone : %d\n"
@ -31,10 +31,11 @@ void *malloc_tiny(size_t size) {
zone, zone,
curr, curr,
sizeof(t_zone), sizeof(t_zone),
sizeof(t_block)); sizeof(t_block));*/
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)(curr) + sizeof(t_block)); return (void *)((char *)(curr) + sizeof(t_block));
} }
else { else {
@ -54,6 +55,7 @@ void *malloc_tiny(size_t size) {
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)curr + sizeof(t_block)); return (void *)((char *)curr + sizeof(t_block));
} }
if (zone->next == NULL) { if (zone->next == NULL) {
@ -70,7 +72,7 @@ t_zone *create_new_small_zone(void) {
t_zone *zone; t_zone *zone;
// TODO protect mmap // TODO protect mmap
zone = (t_zone *)mmap(NULL, g_zones.small_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); zone = (t_zone *)mmap(NULL, g_zones.small_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
zone->head = NULL; zone->head = NULL;
zone->next = NULL; zone->next = NULL;
return zone; return zone;
} }
@ -88,7 +90,7 @@ void *malloc_small(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.small_zones : %p\n" /*ft_printf("addr of g_zones.small_zones : %p\n"
"addr of zone : %p\n" "addr of zone : %p\n"
"addr of *head %p\n" "addr of *head %p\n"
"sizeof tzone : %d\n" "sizeof tzone : %d\n"
@ -97,10 +99,11 @@ void *malloc_small(size_t size) {
zone, zone,
curr, curr,
sizeof(t_zone), sizeof(t_zone),
sizeof(t_block)); sizeof(t_block));*/
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)(curr) + sizeof(t_block)); return (void *)((char *)(curr) + sizeof(t_block));
} }
else { else {
@ -120,6 +123,7 @@ void *malloc_small(size_t size) {
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)curr + sizeof(t_block)); return (void *)((char *)curr + sizeof(t_block));
} }
if (zone->next == NULL) { if (zone->next == NULL) {
@ -141,6 +145,7 @@ void *malloc_large(size_t size) {
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)curr + sizeof(t_block)); return (void *)((char *)curr + sizeof(t_block));
} }
while (curr->next) { while (curr->next) {
@ -152,24 +157,35 @@ void *malloc_large(size_t size) {
curr->size = size; curr->size = size;
curr->free = 0; curr->free = 0;
curr->next = NULL; curr->next = NULL;
ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block)));
return (void *)((char *)curr + sizeof(t_block)); return (void *)((char *)curr + sizeof(t_block));
} }
void *malloc(size_t size) { void *malloc(size_t size) {
pthread_mutex_lock(&g_malloc_mutex); pthread_mutex_lock(&g_malloc_mutex);
ft_printf("malloc %d\n", size);
void *ptr = NULL; void *ptr = NULL;
if (size < g_zones.tiny_block_max_size) { if (size < g_zones.tiny_block_max_size) {
write(1, "malloc tiny\n", 12); ft_printf("malloc tiny %d\n", size);
ptr = malloc_tiny(size); ptr = malloc_tiny(size);
} else if (size < g_zones.small_block_max_size) { } else if (size < g_zones.small_block_max_size) {
write(1, "malloc small\n", 13); ft_printf("malloc small %d\n", size);
ptr = malloc_small(size); ptr = malloc_small(size);
} else { } else {
write(1, "malloc large\n", 13); ft_printf("malloc large %d\n", size);
ptr = malloc_large(size); ptr = malloc_large(size);
} }
pthread_mutex_unlock(&g_malloc_mutex); pthread_mutex_unlock(&g_malloc_mutex);
return ptr; return ptr;
} }
size_t malloc_usable_size(void *ptr) {
show_alloc_mem();
ft_printf("on est la %p\n", ptr);
if (!ptr) {
return 0;
}
t_block *block = (t_block *)((char *)ptr - sizeof(t_block));
ft_printf("on est la %d\n", block->size);
return block->size;
}

View File

@ -83,5 +83,7 @@ void *realloc(void *ptr, size_t size) {
ft_printf("exiting\n"); ft_printf("exiting\n");
show_alloc_mem(); show_alloc_mem();
pthread_mutex_unlock(&g_malloc_mutex); pthread_mutex_unlock(&g_malloc_mutex);
ft_printf("returning\n");
return ptr; return ptr;
} }