rsys

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

commit 10e994032844560e914cc38489b6b5f965558f98
parent 924d9a4017b0e087eb621803422e3305b4e73ab3
Author: vaplv <vaplv@free.fr>
Date:   Wed, 12 Apr 2017 11:41:00 +0200

Add the regular allocator

The regular allocator relies on the interface of the default allocator.

Diffstat:
Msrc/mem_allocator.c | 51++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/mem_allocator.h | 11+++++++++++
Msrc/test_mem_allocator.c | 9+++++++--
3 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/src/mem_allocator.c b/src/mem_allocator.c @@ -652,7 +652,7 @@ mem_init_proxy_allocator struct proxy_data* proxy_data = NULL; res_T res = RES_OK; - if((!allocator) | (!proxy_allocator)) { + if(!allocator || !proxy_allocator) { res = RES_BAD_ARG; goto error; } @@ -707,3 +707,52 @@ mem_shutdown_proxy_allocator(struct mem_allocator* proxy) memset(proxy, 0, sizeof(struct mem_allocator)); } +/******************************************************************************* + * Regular allocator + ******************************************************************************/ +res_T +mem_init_regular_allocator(struct mem_allocator* allocator) +{ + struct alloc_counter* counter = NULL; + res_T res = RES_OK; + + if(!allocator) { + res = RES_BAD_ARG; + goto error; + } + + counter = mem_calloc(1, sizeof(struct alloc_counter)); + if(!counter) { + res = RES_MEM_ERR; + goto error; + } + + allocator->alloc = default_alloc; + allocator->calloc = default_calloc; + allocator->realloc = default_realloc; + allocator->mem_size = default_mem_size; + allocator->alloc_aligned = default_alloc_aligned; + allocator->rm = default_free; + allocator->allocated_size = default_allocated_size; + allocator->dump = default_dump; + allocator->data = (void*)counter; + +exit: + return res; +error: + if(counter) mem_rm(counter); + if(allocator) memset(allocator, 0, sizeof(struct mem_allocator)); + goto exit; +} + +void +mem_shutdown_regular_allocator(struct mem_allocator* allocator) +{ + struct alloc_counter* counter; + ASSERT(allocator); + + counter = allocator->data; + ASSERT(!counter->allocated_size && !counter->nb_allocs); + mem_rm(counter); + memset(allocator, 0, sizeof(struct mem_allocator)); +} diff --git a/src/mem_allocator.h b/src/mem_allocator.h @@ -126,6 +126,17 @@ RSYS_API void mem_shutdown_proxy_allocator (struct mem_allocator* proxy_allocator); +/******************************************************************************* + * Regular allocator + ******************************************************************************/ +RSYS_API res_T +mem_init_regular_allocator + (struct mem_allocator* allocator); + +RSYS_API void +mem_shutdown_regular_allocator + (struct mem_allocator* allocator); + END_DECLS #endif /* MEM_ALLOCATOR_H */ diff --git a/src/test_mem_allocator.c b/src/test_mem_allocator.c @@ -156,12 +156,17 @@ main(int argc, char** argv) printf("-- Default allocator\n"); test_allocator(&mem_default_allocator); + printf("\n-- Regular allocator\n"); + CHECK(mem_init_regular_allocator(&allocator), RES_OK); + test_allocator(&allocator); + mem_shutdown_regular_allocator(&allocator); + printf("\n-- Proxy allocator of default allocator\n"); - mem_init_proxy_allocator(&allocator, &mem_default_allocator); + CHECK(mem_init_proxy_allocator(&allocator, &mem_default_allocator), RES_OK); test_allocator(&allocator); printf("\n-- Proxy allocator of proxy allocator\n"); - mem_init_proxy_allocator(&allocator2, &allocator); + CHECK(mem_init_proxy_allocator(&allocator2, &allocator), RES_OK); test_allocator(&allocator2); mem_shutdown_proxy_allocator(&allocator2);