chore: upload save
This commit is contained in:
parent
00f1d503c1
commit
4121fcd7fd
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
make
|
||||||
|
LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so $@
|
|
@ -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);
|
||||||
|
|
18
src/free.c
18
src/free.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
36
src/malloc.c
36
src/malloc.c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue