From 898ffefde4198a23a92810a9cf39ff6846f3bb39 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 15 May 2017 21:37:34 +0200 Subject: add libpseudotalloc as super-simplistic talloc replacement In tightly embedded builds (--enable-embedded), we want the ability to replace talloc with a very simple heap allocator to avoid the complexity of talloc without modifying all our code that assumes talloc. This will break the hierarchical notion of the allocator, but libosmo{core,gsm,coding,codec} don't rely on that anyway. Change-Id: Ie341034076f242a813f081919dd09d845775ad35 --- src/pseudotalloc/Makefile.am | 12 ++++++++ src/pseudotalloc/pseudotalloc.c | 63 +++++++++++++++++++++++++++++++++++++++++ src/pseudotalloc/talloc.h | 42 +++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/pseudotalloc/Makefile.am create mode 100644 src/pseudotalloc/pseudotalloc.c create mode 100644 src/pseudotalloc/talloc.h (limited to 'src/pseudotalloc') diff --git a/src/pseudotalloc/Makefile.am b/src/pseudotalloc/Makefile.am new file mode 100644 index 00000000..3c78bba8 --- /dev/null +++ b/src/pseudotalloc/Makefile.am @@ -0,0 +1,12 @@ +AM_CFLAGS = -Wall -I. $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)/include + +if ENABLE_PSEUDOTALLOC + +lib_LTLIBRARIES = libpseudotalloc.la + +libpseudotalloc_la_SOURCES = pseudotalloc.c +libpseudotalloc_la_LDFLAGS = -no-undefined + +nobase_include_HEADERS = talloc.h + +endif diff --git a/src/pseudotalloc/pseudotalloc.c b/src/pseudotalloc/pseudotalloc.c new file mode 100644 index 00000000..fe7f1edc --- /dev/null +++ b/src/pseudotalloc/pseudotalloc.c @@ -0,0 +1,63 @@ +/* overly simplistic talloc replacement for deeply embedded + * microcontrollers. Obviously this has none of the properties of real + * talloc, it is particualrly not hierarchical at all */ + + +#include "talloc.h" +#include + +void *_talloc_zero(const void *ctx, size_t size, const char *name) +{ + void *p = pseudotalloc_malloc(size); + if (!p) + return NULL; + memset(p, 0, size); + return p; +} + +int _talloc_free(void *ptr, const char *location) +{ + pseudotalloc_free(ptr); + return 0; +} + +void *talloc_named_const(const void *context, size_t size, const char *name) +{ + return pseudotalloc_malloc(size); +} + +void talloc_set_name_const(const void *ptr, const char *name) +{ +} + +char *talloc_strdup(const void *context, const char *p) +{ + char *ptr; + size_t len; + + if (!p) + return NULL; + len = strlen(p); + + ptr = talloc_size(context, len+1); + if (!ptr) + return NULL; + memcpy(ptr, p, len+1); + + return ptr; +} + +void *talloc_pool(const void *context, size_t size) +{ + return (void *) context; +} + +void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name) +{ + return talloc_size(ctx, el_size * count); +} + +void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name) +{ + return talloc_zero_size(ctx, el_size * count); +} diff --git a/src/pseudotalloc/talloc.h b/src/pseudotalloc/talloc.h new file mode 100644 index 00000000..c7127deb --- /dev/null +++ b/src/pseudotalloc/talloc.h @@ -0,0 +1,42 @@ +#pragma once + +/* overly simplistic talloc replacement for deeply embedded + * microcontrollers. Obviously this has none of the properties of real + * talloc, it is particualrly not hierarchical at all */ + +#include +#include + +/* those two functions have to be provided by the user/environment */ +extern void *pseudotalloc_malloc(size_t size); +extern void pseudotalloc_free(void *ptr); + +typedef void TALLOC_CTX; + +#define __TALLOC_STRING_LINE1__(s) #s +#define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s) +#define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__) +#define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ + +#define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) +#define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) +void *_talloc_zero(const void *ctx, size_t size, const char *name); + +#define talloc_free(ctx) _talloc_free(ctx, __location__) +int _talloc_free(void *ptr, const char *location); + +/* Unsupported! */ +#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) +#define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) +void *talloc_named_const(const void *context, size_t size, const char *name); +void talloc_set_name_const(const void *ptr, const char *name); +char *talloc_strdup(const void *t, const char *p); +void *talloc_pool(const void *context, size_t size); +#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) +void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); +#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) +void *_talloc_zero_array(const void *ctx, + size_t el_size, + unsigned count, + const char *name); + -- cgit v1.2.3