commit 1c79edb844d2c1d1ef719a77981c06cd4efb7dcb
parent eb66eb83f13ad3e58c2094a87a6a93aaef778d33
Author: vaplv <vaplv@free.fr>
Date: Wed, 6 Sep 2017 11:26:20 +0200
Fix error management on memory allocator initialization
Diffstat:
4 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/src/mem_allocator.c b/src/mem_allocator.c
@@ -418,6 +418,7 @@ mem_init_regular_allocator(struct mem_allocator* allocator)
res = RES_BAD_ARG;
goto error;
}
+ memset(allocator, 0, sizeof(struct mem_allocator));
counter = mem_calloc(1, sizeof(struct alloc_counter));
if(!counter) {
@@ -438,8 +439,7 @@ mem_init_regular_allocator(struct mem_allocator* allocator)
exit:
return res;
error:
- if(counter) mem_rm(counter);
- if(allocator) memset(allocator, 0, sizeof(struct mem_allocator));
+ if(allocator) mem_shutdown_regular_allocator(allocator);
goto exit;
}
@@ -450,7 +450,9 @@ mem_shutdown_regular_allocator(struct mem_allocator* allocator)
ASSERT(allocator);
counter = allocator->data;
- ASSERT(!counter->allocated_size && !counter->nb_allocs);
- mem_rm(counter);
+ if(counter) {
+ ASSERT(!counter->allocated_size && !counter->nb_allocs);
+ mem_rm(counter);
+ }
memset(allocator, 0, sizeof(struct mem_allocator));
}
diff --git a/src/mem_lifo_allocator.c b/src/mem_lifo_allocator.c
@@ -249,13 +249,15 @@ mem_init_lifo_allocator
res = RES_BAD_ARG;
goto error;
}
+ memset(lifo_allocator, 0, sizeof(struct mem_allocator));
lifo = MEM_CALLOC(allocator, 1, sizeof(struct lifo_data));
if(!lifo) {
res = RES_MEM_ERR;
goto error;
}
-
+ lifo_allocator->data = (void*)lifo;
+ lifo->allocator = allocator;
lifo->stack = MEM_ALLOC_ALIGNED(allocator, size, LIFO_DEFAULT_ALIGNMENT);
if(!lifo->stack) {
res = RES_MEM_ERR;
@@ -269,7 +271,6 @@ mem_init_lifo_allocator
lifo->top = lifo->stack;
lifo->capacity = size;
lifo->remain = size;
- lifo->allocator = allocator;
lifo_allocator->alloc = lifo_alloc;
lifo_allocator->calloc = lifo_calloc;
@@ -279,14 +280,12 @@ mem_init_lifo_allocator
lifo_allocator->rm = lifo_free;
lifo_allocator->allocated_size = lifo_allocated_size;
lifo_allocator->dump = lifo_dump;
- lifo_allocator->data = (void*)lifo;
exit:
return res;
error:
- if(lifo_allocator) {
+ if(lifo_allocator)
mem_shutdown_lifo_allocator(lifo_allocator);
- }
goto exit;
}
diff --git a/src/mem_proxy_allocator.c b/src/mem_proxy_allocator.c
@@ -272,19 +272,20 @@ mem_init_proxy_allocator
res = RES_BAD_ARG;
goto error;
}
+ memset(proxy_allocator, 0, sizeof(struct mem_allocator));
proxy_data = MEM_CALLOC(allocator, 1, sizeof(struct proxy_data));
if(!proxy_data) {
res = RES_MEM_ERR;
goto error;
}
+ proxy_allocator->data = (void*)proxy_data;
+
+ proxy_data->allocator = allocator;
proxy_data->mutex = mutex_create();
if(!proxy_data->mutex) {
res = RES_MEM_ERR;
goto error;
}
- proxy_data->allocator = allocator;
- proxy_data->node_list = NULL;
-
proxy_allocator->alloc = proxy_alloc;
proxy_allocator->calloc = proxy_calloc;
proxy_allocator->realloc = proxy_realloc;
@@ -293,14 +294,12 @@ mem_init_proxy_allocator
proxy_allocator->rm = proxy_free;
proxy_allocator->allocated_size = proxy_allocated_size;
proxy_allocator->dump = proxy_dump;
- proxy_allocator->data = (void*)proxy_data;
exit:
return res;
error:
- if(proxy_allocator) {
+ if(proxy_allocator)
mem_shutdown_proxy_allocator(proxy_allocator);
- }
goto exit;
}
@@ -311,8 +310,8 @@ mem_shutdown_proxy_allocator(struct mem_allocator* proxy)
ASSERT(proxy);
proxy_data = proxy->data;
- ASSERT(proxy_data->node_list == NULL);
if(proxy_data) {
+ ASSERT(proxy_data->node_list == NULL);
if(proxy_data->mutex) mutex_destroy(proxy_data->mutex);
MEM_RM(proxy_data->allocator, proxy_data);
}
diff --git a/src/test_mem_allocator.c b/src/test_mem_allocator.c
@@ -157,6 +157,7 @@ main(int argc, char** argv)
test_allocator(&mem_default_allocator);
printf("\n-- Regular allocator\n");
+ CHECK(mem_init_regular_allocator(NULL), RES_BAD_ARG);
CHECK(mem_init_regular_allocator(&allocator), RES_OK);
test_allocator(&allocator);
mem_shutdown_regular_allocator(&allocator);
@@ -191,6 +192,7 @@ main(int argc, char** argv)
CHECK(MEM_AREA_OVERLAP(mem + 7, sizeof(int[1]), mem, sizeof(int[8])), 1);
CHECK(MEM_ALLOCATED_SIZE(&mem_default_allocator), 0);
+ CHECK(mem_allocated_size(), 0);
return 0;
}