rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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:
Msrc/mem_allocator.c | 10++++++----
Msrc/mem_lifo_allocator.c | 9++++-----
Msrc/mem_proxy_allocator.c | 13++++++-------
Msrc/test_mem_allocator.c | 2++
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; }