create get_chunk func to simplify
This commit is contained in:
		@ -60,4 +60,24 @@ int get_append_unused_chunk(void *root, size_t size, chunk_t *result, size_t new
 | 
			
		||||
        chunk_split(result, size);
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int get_chunk(void *data_start, chunk_t *result, int *category)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    void *chunk_pos;
 | 
			
		||||
 | 
			
		||||
    for (i = TINY; i <= LARGE; i++)
 | 
			
		||||
    {
 | 
			
		||||
        chunk_pos = raw_get_chunk_by_root(allocs_tree[i], data_start);
 | 
			
		||||
        if (chunk_pos == NULL)
 | 
			
		||||
            continue;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    if (chunk_pos == NULL)
 | 
			
		||||
        return 1;
 | 
			
		||||
    chunk_read(chunk_pos, result);
 | 
			
		||||
    if (category)
 | 
			
		||||
        *category = i;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -5,4 +5,5 @@
 | 
			
		||||
void chunk_iter(chunk_t *root, void (*f)(chunk_t*));
 | 
			
		||||
void chunk_merge(chunk_t *first, chunk_t *second);
 | 
			
		||||
int get_append_unused_chunk(void *root, size_t size, chunk_t *result, size_t new_block_size);
 | 
			
		||||
int chunk_split(chunk_t *chunk, size_t new_size);
 | 
			
		||||
int chunk_split(chunk_t *chunk, size_t new_size);
 | 
			
		||||
int get_chunk(void *data_start, chunk_t *result, int *category);
 | 
			
		||||
							
								
								
									
										24
									
								
								src/free.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/free.c
									
									
									
									
									
								
							@ -1,6 +1,10 @@
 | 
			
		||||
#include "chunk.h"
 | 
			
		||||
#include "malloc.h"
 | 
			
		||||
#include "chunk_manager.h"
 | 
			
		||||
#include "block.h"
 | 
			
		||||
#include "raw_chunk_manager.h"
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
void free_tiny(chunk_t *chunk)
 | 
			
		||||
@ -47,28 +51,20 @@ static void (*free_funcs[3])(chunk_t*) = {free_tiny, free_small, free_large};
 | 
			
		||||
 | 
			
		||||
void ft_free(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
	void    *raw_chunk;
 | 
			
		||||
	chunk_t chunk;
 | 
			
		||||
	size_t i;
 | 
			
		||||
    int category;
 | 
			
		||||
 | 
			
		||||
	if (ptr == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
	for (i = TINY; i <= LARGE; i++)
 | 
			
		||||
	{
 | 
			
		||||
		raw_chunk = raw_get_chunk(allocs_tree[i], ptr);
 | 
			
		||||
		if (raw_chunk == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
    if (get_chunk(ptr, &chunk, &category))
 | 
			
		||||
    {
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
    if (raw_chunk == NULL)
 | 
			
		||||
        write(2, "chunk not found\n", 16);
 | 
			
		||||
#endif
 | 
			
		||||
	chunk_read(raw_chunk, &chunk);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if (chunk.is_used == false)
 | 
			
		||||
		write(2, "double free\n", 12);
 | 
			
		||||
#endif
 | 
			
		||||
	// CALL THE RIGHT FREE FUNCTION DEPEND ON SIZE
 | 
			
		||||
	free_funcs[i](&chunk);	
 | 
			
		||||
	free_funcs[category](&chunk);	
 | 
			
		||||
}
 | 
			
		||||
@ -15,7 +15,7 @@ void *raw_get_last_chunk(void **root)
 | 
			
		||||
    return current;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void    *raw_get_chunk(void **root, void *data_start)
 | 
			
		||||
void    *raw_get_chunk_by_root(void **root, void *data_start)
 | 
			
		||||
{
 | 
			
		||||
    void**current = root;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
void *raw_get_last_chunk(void **root);
 | 
			
		||||
void *raw_get_chunk(void **root, void *data_start);
 | 
			
		||||
void *raw_get_chunk_by_root(void **root, void *data_start);
 | 
			
		||||
int get_unused_chunk_raw(void *root, size_t size, chunk_t *result);
 | 
			
		||||
int is_alone_on_block(const chunk_t *chunk);
 | 
			
		||||
		Reference in New Issue
	
	Block a user