mirror of https://gerrit.osmocom.org/libosmocore
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:
parent
7f24c155f5
commit
898ffefde4
|
@ -1,7 +1,7 @@
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
|
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
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \
|
pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \
|
||||||
|
|
10
configure.ac
10
configure.ac
|
@ -194,6 +194,14 @@ AC_ARG_ENABLE(ctrl,
|
||||||
[enable_ctrl=$enableval], [enable_ctrl="yes"])
|
[enable_ctrl=$enableval], [enable_ctrl="yes"])
|
||||||
AM_CONDITIONAL(ENABLE_CTRL, test x"$enable_ctrl" = x"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,
|
AC_ARG_ENABLE(embedded,
|
||||||
[AS_HELP_STRING(
|
[AS_HELP_STRING(
|
||||||
[--enable-embedded],
|
[--enable-embedded],
|
||||||
|
@ -211,6 +219,7 @@ then
|
||||||
AM_CONDITIONAL(ENABLE_UTILITIES, false)
|
AM_CONDITIONAL(ENABLE_UTILITIES, false)
|
||||||
AM_CONDITIONAL(ENABLE_GB, false)
|
AM_CONDITIONAL(ENABLE_GB, false)
|
||||||
AM_CONDITIONAL(ENABLE_PCSC, 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])
|
AC_DEFINE([PANIC_INFLOOP],[1],[Use infinite loop on panic rather than fprintf/abort])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -287,6 +296,7 @@ AC_OUTPUT(
|
||||||
src/gsm/Makefile
|
src/gsm/Makefile
|
||||||
src/gb/Makefile
|
src/gb/Makefile
|
||||||
src/ctrl/Makefile
|
src/ctrl/Makefile
|
||||||
|
src/pseudotalloc/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
tests/atlocal
|
tests/atlocal
|
||||||
utils/Makefile
|
utils/Makefile
|
||||||
|
|
|
@ -6,6 +6,10 @@ LIBVERSION=8:0:0
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
|
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
|
||||||
AM_CFLAGS = -Wall $(TALLOC_CFLAGS)
|
AM_CFLAGS = -Wall $(TALLOC_CFLAGS)
|
||||||
|
|
||||||
|
if ENABLE_PSEUDOTALLOC
|
||||||
|
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
|
||||||
|
endif
|
||||||
|
|
||||||
lib_LTLIBRARIES = libosmocore.la
|
lib_LTLIBRARIES = libosmocore.la
|
||||||
|
|
||||||
libosmocore_la_LIBADD = $(BACKTRACE_LIB) $(TALLOC_LIBS)
|
libosmocore_la_LIBADD = $(BACKTRACE_LIB) $(TALLOC_LIBS)
|
||||||
|
|
|
@ -6,6 +6,11 @@ LIBVERSION=0:0:0
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/include $(TALLOC_CFLAGS)
|
AM_CPPFLAGS = -I$(top_srcdir)/include $(TALLOC_CFLAGS)
|
||||||
AM_CFLAGS = -Wall
|
AM_CFLAGS = -Wall
|
||||||
|
|
||||||
|
if ENABLE_PSEUDOTALLOC
|
||||||
|
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libosmocodec.la
|
lib_LTLIBRARIES = libosmocodec.la
|
||||||
|
|
||||||
libosmocodec_la_SOURCES = gsm610.c gsm620.c gsm660.c gsm690.c
|
libosmocodec_la_SOURCES = gsm610.c gsm620.c gsm660.c gsm690.c
|
||||||
|
|
|
@ -9,6 +9,10 @@ AM_CPPFLAGS = \
|
||||||
$(TALLOC_CFLAGS)
|
$(TALLOC_CFLAGS)
|
||||||
AM_CFLAGS = -Wall
|
AM_CFLAGS = -Wall
|
||||||
|
|
||||||
|
if ENABLE_PSEUDOTALLOC
|
||||||
|
AM_CPPFLAGS += -I$(top_srcdir)/src/pseudotalloc
|
||||||
|
endif
|
||||||
|
|
||||||
lib_LTLIBRARIES = libosmocoding.la
|
lib_LTLIBRARIES = libosmocoding.la
|
||||||
|
|
||||||
libosmocoding_la_SOURCES = \
|
libosmocoding_la_SOURCES = \
|
||||||
|
|
|
@ -6,6 +6,10 @@ LIBVERSION=7:0:1
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(TALLOC_CFLAGS)
|
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(TALLOC_CFLAGS)
|
||||||
AM_CFLAGS = -Wall ${GCC_FVISIBILITY_HIDDEN}
|
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
|
# FIXME: this should eventually go into a milenage/Makefile.am
|
||||||
noinst_HEADERS = milenage/aes.h milenage/aes_i.h milenage/aes_wrap.h \
|
noinst_HEADERS = milenage/aes.h milenage/aes_i.h milenage/aes_wrap.h \
|
||||||
milenage/common.h milenage/crypto.h milenage/includes.h \
|
milenage/common.h milenage/crypto.h milenage/includes.h \
|
||||||
|
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue