split free, malloc, realloc
This commit is contained in:
		
							
								
								
									
										82
									
								
								src/free.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/free.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
			
		||||
#include "chunk.h"
 | 
			
		||||
#include "malloc.h"
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
void free_tiny(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	chunk_t chunk_prev, chunk_next, *first_chunk = chunk, *last_chunk = chunk;
 | 
			
		||||
 | 
			
		||||
	if (chunk->prev)
 | 
			
		||||
	{
 | 
			
		||||
		chunk_read(chunk->prev, &chunk_prev);
 | 
			
		||||
		if (chunk_prev.is_used == false && chunk_prev.block_id == chunk->block_id)
 | 
			
		||||
			first_chunk = &chunk_prev;
 | 
			
		||||
	}
 | 
			
		||||
	if (chunk->next)
 | 
			
		||||
	{
 | 
			
		||||
		chunk_read(chunk->next, &chunk_next);
 | 
			
		||||
		if (chunk_next.is_used == false && chunk_next.block_id == chunk->block_id)
 | 
			
		||||
			last_chunk = &chunk_next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	first_chunk->is_used = false;
 | 
			
		||||
	chunk_merge(first_chunk, last_chunk);
 | 
			
		||||
 | 
			
		||||
	if (is_alone_on_block(first_chunk))
 | 
			
		||||
	{
 | 
			
		||||
		if (first_chunk->current == allocs_tree[TINY])
 | 
			
		||||
			allocs_tree[TINY] = last_chunk->next;
 | 
			
		||||
		destroy_block(first_chunk);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_small(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	(void) chunk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_large(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	if (chunk->current == allocs_tree[LARGE])
 | 
			
		||||
		allocs_tree[LARGE] = chunk->next;
 | 
			
		||||
	destroy_block(chunk);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void (*free_funcs[3])(chunk_t*) = {free_tiny, free_small, free_large};
 | 
			
		||||
 | 
			
		||||
void ft_free(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
	void    **root;
 | 
			
		||||
	void    *raw_chunk;
 | 
			
		||||
	chunk_t chunk;
 | 
			
		||||
	size_t i;
 | 
			
		||||
 | 
			
		||||
	if (ptr == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = TINY; i <= LARGE + 1; i++)
 | 
			
		||||
	{
 | 
			
		||||
#ifndef DEBUG
 | 
			
		||||
		if (i > LARGE)
 | 
			
		||||
			write(2, "chunk not found\n", 16);
 | 
			
		||||
#endif
 | 
			
		||||
		root = allocs_tree[i];
 | 
			
		||||
		
 | 
			
		||||
		raw_chunk = raw_get_chunk(root, ptr);
 | 
			
		||||
		if (raw_chunk == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	chunk_read(raw_chunk, &chunk);
 | 
			
		||||
 | 
			
		||||
#ifndef 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);	
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										78
									
								
								src/malloc.c
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								src/malloc.c
									
									
									
									
									
								
							@ -66,82 +66,4 @@ void *ft_malloc(size_t size)
 | 
			
		||||
	if (size < m)
 | 
			
		||||
		return alloc_small(size);
 | 
			
		||||
	return alloc_large(size); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_tiny(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	chunk_t chunk_prev, chunk_next, *first_chunk = chunk, *last_chunk = chunk;
 | 
			
		||||
 | 
			
		||||
	if (chunk->prev)
 | 
			
		||||
	{
 | 
			
		||||
		chunk_read(chunk->prev, &chunk_prev);
 | 
			
		||||
		if (chunk_prev.is_used == false && chunk_prev.block_id == chunk->block_id)
 | 
			
		||||
			first_chunk = &chunk_prev;
 | 
			
		||||
	}
 | 
			
		||||
	if (chunk->next)
 | 
			
		||||
	{
 | 
			
		||||
		chunk_read(chunk->next, &chunk_next);
 | 
			
		||||
		if (chunk_next.is_used == false && chunk_next.block_id == chunk->block_id)
 | 
			
		||||
			last_chunk = &chunk_next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	first_chunk->is_used = false;
 | 
			
		||||
	chunk_merge(first_chunk, last_chunk);
 | 
			
		||||
 | 
			
		||||
	if (is_alone_on_block(first_chunk))
 | 
			
		||||
	{
 | 
			
		||||
		if (first_chunk->current == allocs_tree[TINY])
 | 
			
		||||
			allocs_tree[TINY] = last_chunk->next;
 | 
			
		||||
		destroy_block(first_chunk);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_small(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	(void) chunk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_large(chunk_t *chunk)
 | 
			
		||||
{
 | 
			
		||||
	if (chunk->current == allocs_tree[LARGE])
 | 
			
		||||
		allocs_tree[LARGE] = chunk->next;
 | 
			
		||||
	destroy_block(chunk);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void (*free_funcs[3])(chunk_t*) = {free_tiny, free_small, free_large};
 | 
			
		||||
 | 
			
		||||
void ft_free(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
	void    **root;
 | 
			
		||||
	void    *raw_chunk;
 | 
			
		||||
	chunk_t chunk;
 | 
			
		||||
	size_t i;
 | 
			
		||||
 | 
			
		||||
	if (ptr == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = TINY; i <= LARGE + 1; i++)
 | 
			
		||||
	{
 | 
			
		||||
#ifndef DEBUG
 | 
			
		||||
		if (i > LARGE)
 | 
			
		||||
			write(2, "chunk not found\n", 16);
 | 
			
		||||
#endif
 | 
			
		||||
		root = allocs_tree[i];
 | 
			
		||||
		
 | 
			
		||||
		raw_chunk = raw_get_chunk(root, ptr);
 | 
			
		||||
		if (raw_chunk == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	chunk_read(raw_chunk, &chunk);
 | 
			
		||||
 | 
			
		||||
#ifndef 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);	
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								src/realloc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/realloc.c
									
									
									
									
									
										Normal file
									
								
							
		Reference in New Issue
	
	Block a user