fix: large malloc first block wasn't written correctly
This commit is contained in:
parent
36dc194c28
commit
ca800fdb36
|
@ -40,10 +40,9 @@ 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;
|
||||||
|
|
||||||
void *malloc(size_t size);
|
|
||||||
void *ft_malloc(size_t size);
|
void *ft_malloc(size_t size);
|
||||||
void free(void *ptr);
|
void ft_free(void *ptr);
|
||||||
void *realloc(void *ptr, size_t size);
|
void *ft_realloc(void *ptr, size_t size);
|
||||||
|
|
||||||
void show_alloc_mem(void);
|
void show_alloc_mem(void);
|
||||||
void show_alloc_mem_ex(void);
|
void show_alloc_mem_ex(void);
|
||||||
|
|
31
main.c
31
main.c
|
@ -3,14 +3,37 @@
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
srand(argv[1][0]+argv[1][1]+argv[1][2]);
|
srand(argv[1][0]+argv[1][1]+argv[1][2]);
|
||||||
int *arr;
|
int **arr = (int **)ft_malloc(atoi(argv[2]) * sizeof(int *));
|
||||||
size_t size;
|
size_t size;
|
||||||
for (int i = 0; i < atoi(argv[2]); i++) {
|
for (int i = 0; i < atoi(argv[2]); i++) {
|
||||||
size = (rand() & 0x7ff) | 0xf00000;
|
size = (rand() & 0x7ff) | 0xf00000;
|
||||||
arr = (int *)ft_malloc(size * sizeof(int));
|
arr[i] = (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[i], size);
|
||||||
free(arr);
|
//ft_free(arr);
|
||||||
}
|
}
|
||||||
|
ft_free(arr[3]);
|
||||||
|
ft_free(arr[5]);
|
||||||
|
ft_free(arr[1]);
|
||||||
|
ft_free(arr[6]);
|
||||||
|
ft_free(arr[2]);
|
||||||
|
ft_free(arr[4]);
|
||||||
|
ft_free(arr[0]);
|
||||||
|
ft_free(arr[7]);
|
||||||
|
// for (int i = 0; i < atoi(argv[2]); i++) {
|
||||||
|
// ft_free(arr[i]);
|
||||||
|
// }
|
||||||
|
printf("second round\n");
|
||||||
|
for (int i = 0; i < atoi(argv[2]); i++) {
|
||||||
|
size = (rand() & 0x7ff) | 0xf00000;
|
||||||
|
arr[i] = (int *)ft_malloc(size * sizeof(int));
|
||||||
|
printf ("arr %d addr: %p arr size: %zu\n", i, arr[i], size);
|
||||||
|
//ft_free(arr);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < atoi(argv[2]); i++) {
|
||||||
|
ft_free(arr[i]);
|
||||||
|
}
|
||||||
|
printf("free arr");
|
||||||
|
ft_free(arr);
|
||||||
show_alloc_sizes();
|
show_alloc_sizes();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "malloc.h"
|
#include "malloc.h"
|
||||||
|
|
||||||
void free(void *ptr) {
|
void ft_free(void *ptr) {
|
||||||
pthread_mutex_lock(&g_malloc_mutex);
|
pthread_mutex_lock(&g_malloc_mutex);
|
||||||
t_block *block = (t_block *)((char *)ptr - sizeof(t_block));
|
t_block *block = (t_block *)((char *)ptr - sizeof(t_block));
|
||||||
if (block->size < g_zones.small_block_max_size) {
|
if (block->size < g_zones.small_block_max_size) {
|
||||||
|
|
11
src/malloc.c
11
src/malloc.c
|
@ -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;
|
||||||
printf("addr of g_zones.tiny_zones : %p\n"
|
/*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 : %zu\n"
|
"sizeof tzone : %zu\n"
|
||||||
|
@ -31,7 +31,7 @@ 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;
|
||||||
|
@ -87,7 +87,7 @@ void *malloc_small(size_t size) {
|
||||||
}
|
}
|
||||||
zone->head = (t_block *)addr;
|
zone->head = (t_block *)addr;
|
||||||
curr = zone->head;
|
curr = zone->head;
|
||||||
printf("addr of g_zones.small_zones : %p\n"
|
/*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 : %zu\n"
|
"sizeof tzone : %zu\n"
|
||||||
|
@ -96,7 +96,7 @@ 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;
|
||||||
|
@ -134,7 +134,8 @@ void *malloc_large(size_t size) {
|
||||||
t_block *curr = g_zones.large_blocks;
|
t_block *curr = g_zones.large_blocks;
|
||||||
if (curr == NULL) {
|
if (curr == NULL) {
|
||||||
// TODO protect mmap
|
// TODO protect mmap
|
||||||
curr = (t_block *)((char *)mmap(NULL, size + sizeof(t_block) + (16 - sizeof(t_block) % 16), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) + (16 - sizeof(t_block) % 16));
|
g_zones.large_blocks = (t_block *)((char *)mmap(NULL, size + sizeof(t_block) + (16 - sizeof(t_block) % 16), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) + (16 - sizeof(t_block) % 16));
|
||||||
|
curr = g_zones.large_blocks;
|
||||||
curr->size = size;
|
curr->size = size;
|
||||||
curr->free = 0;
|
curr->free = 0;
|
||||||
curr->next = NULL;
|
curr->next = NULL;
|
||||||
|
|
Loading…
Reference in New Issue