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:
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);