feat(debug): add NULL check in arena and vector deinit functions in debug builds
Signed-off-by: Lorenzo Torres <lorenzo@sagittarius-a.org>
This commit is contained in:
parent
97d61eac5a
commit
a56ebaf19c
2 changed files with 21 additions and 4 deletions
15
core/arena.c
15
core/arena.c
|
|
@ -1,11 +1,12 @@
|
|||
/* SPDX-License-Identifier:BSD-3-Clause */
|
||||
#include "arena.h"
|
||||
#include "log.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
struct arena_allocator *arena_init(usize size)
|
||||
{
|
||||
struct arena_allocator *allocator = (struct arena_allocator *)malloc(sizeof(struct arena_allocator));
|
||||
struct arena_allocator *allocator =
|
||||
(struct arena_allocator *)malloc(sizeof(struct arena_allocator));
|
||||
allocator->size = size;
|
||||
allocator->base = (usize) malloc(size);
|
||||
allocator->position = 0;
|
||||
|
|
@ -15,6 +16,12 @@ struct arena_allocator *arena_init(usize size)
|
|||
|
||||
void arena_deinit(struct arena_allocator *allocator)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (!allocator) {
|
||||
log_error("attempt to free NULL arena\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
free((void *)allocator->base);
|
||||
free((void *)allocator);
|
||||
}
|
||||
|
|
@ -23,7 +30,9 @@ void *arena_alloc(struct arena_allocator *allocator, usize size)
|
|||
{
|
||||
if (allocator->position + size >= allocator->size) {
|
||||
allocator->size = allocator->position + size;
|
||||
allocator->base = (usize) realloc((void *)allocator->base, allocator->size + allocator->size / 2);
|
||||
allocator->base =
|
||||
(usize) realloc((void *)allocator->base,
|
||||
allocator->size + allocator->size / 2);
|
||||
}
|
||||
void *ptr = (void *)(allocator->base + allocator->position);
|
||||
allocator->position += size;
|
||||
|
|
|
|||
|
|
@ -22,13 +22,21 @@ void *vector_shrink(struct vector *vector, usize element_size)
|
|||
vector->length -= 1;
|
||||
if (vector->length <= vector->size / 3) {
|
||||
vector->size = vector->length + vector->length / 2;
|
||||
vector->data = realloc(vector->data, vector->size * element_size + 1);
|
||||
vector->data =
|
||||
realloc(vector->data, vector->size * element_size + 1);
|
||||
}
|
||||
return vector->data;
|
||||
}
|
||||
|
||||
void vector_deinit(struct vector *vector)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (!vector) {
|
||||
log_error("attempt to free NULL vector");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
free(vector->data);
|
||||
free(vector);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue