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
This commit is contained in:
Harald Welte 2017-05-15 21:37:34 +02:00
parent 7f24c155f5
commit 898ffefde4
9 changed files with 145 additions and 1 deletions

View File

@ -1,7 +1,7 @@
ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim utils tests
SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc utils tests
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \

View File

@ -194,6 +194,14 @@ AC_ARG_ENABLE(ctrl,
[enable_ctrl=$enableval], [enable_ctrl="yes"])
AM_CONDITIONAL(ENABLE_CTRL, test x"$enable_ctrl" = x"yes")
AC_ARG_ENABLE(pseudotalloc,
[AS_HELP_STRING(
[--enable-pseudotalloc],
[Enable building pseudotalloc library],
)],
[enable_pseudotalloc=$enableval], [enable_pseudotalloc="no"])
AM_CONDITIONAL(ENABLE_PSEUDOTALLOC, test x"$enable_pseudotalloc" = x"yes")
AC_ARG_ENABLE(embedded,
[AS_HELP_STRING(
[--enable-embedded],
@ -211,6 +219,7 @@ then
AM_CONDITIONAL(ENABLE_UTILITIES, false)
AM_CONDITIONAL(ENABLE_GB, false)
AM_CONDITIONAL(ENABLE_PCSC, false)
AM_CONDITIONAL(ENABLE_PSEUDOTALLOC, true)
AC_DEFINE([PANIC_INFLOOP],[1],[Use infinite loop on panic rather than fprintf/abort])
fi
@ -287,6 +296,7 @@ AC_OUTPUT(
src/gsm/Makefile
src/gb/Makefile
src/ctrl/Makefile
src/pseudotalloc/Makefile
tests/Makefile
tests/atlocal
utils/Makefile

View File

@ -6,6 +6,10 @@ LIBVERSION=8:0:0
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
AM_CFLAGS = -Wall $(TALLOC_CFLAGS)
if ENABLE_PSEUDOTALLOC
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
endif
lib_LTLIBRARIES = libosmocore.la
libosmocore_la_LIBADD = $(BACKTRACE_LIB) $(TALLOC_LIBS)

View File

@ -6,6 +6,11 @@ LIBVERSION=0:0:0
AM_CPPFLAGS = -I$(top_srcdir)/include $(TALLOC_CFLAGS)
AM_CFLAGS = -Wall
if ENABLE_PSEUDOTALLOC
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
endif
lib_LTLIBRARIES = libosmocodec.la
libosmocodec_la_SOURCES = gsm610.c gsm620.c gsm660.c gsm690.c

View File

@ -9,6 +9,10 @@ AM_CPPFLAGS = \
$(TALLOC_CFLAGS)
AM_CFLAGS = -Wall
if ENABLE_PSEUDOTALLOC
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
endif
lib_LTLIBRARIES = libosmocoding.la
libosmocoding_la_SOURCES = \

View File

@ -6,6 +6,10 @@ LIBVERSION=7:0:1
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(TALLOC_CFLAGS)
AM_CFLAGS = -Wall ${GCC_FVISIBILITY_HIDDEN}
if ENABLE_PSEUDOTALLOC
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
endif
# FIXME: this should eventually go into a milenage/Makefile.am
noinst_HEADERS = milenage/aes.h milenage/aes_i.h milenage/aes_wrap.h \
milenage/common.h milenage/crypto.h milenage/includes.h \

View File

@ -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

View File

@ -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 <string.h>
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);
}

42
src/pseudotalloc/talloc.h Normal file
View File

@ -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 <stdlib.h>
#include <stdarg.h>
/* 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);