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: Ie341034076f242a813f081919dd09d845775ad35changes/51/2651/2
parent
7f24c155f5
commit
898ffefde4
|
@ -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 \
|
||||
|
|
10
configure.ac
10
configure.ac
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = \
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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