From 7a2105becdbadf20c1b4e4d2359e339c90610825 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Thu, 4 Mar 1999 11:36:26 +0000 Subject: [PATCH] Use dmalloc instead of EFence when available (dmalloc has lot of improvements over EFence and also hopefully smaller memory overhead, but sadly it's non-free for commercial use). If the DMALLOC_OPTIONS environment variable is not set, switch on `reasonable' checks by default. Also introduced mb_allocz() for cleared mb_alloc(). --- configure.in | 5 ++++- lib/resource.c | 9 +++++++++ lib/resource.h | 18 +++++++++++++++++- lib/xmalloc.c | 6 +++++- sysdep/autoconf.h.in | 3 +++ sysdep/unix/main.c | 6 ++++++ tools/Makefile.in | 2 +- tools/Rules.in | 3 ++- 8 files changed, 47 insertions(+), 5 deletions(-) diff --git a/configure.in b/configure.in index 0b469490..aa527a02 100644 --- a/configure.in +++ b/configure.in @@ -109,7 +109,10 @@ BIRD_CHECK_TIME_T if test "$enable_debug" = yes ; then AC_DEFINE(PATH_CONFIG_DIR, ".") AC_DEFINE(DEBUGGING) - AC_CHECK_LIB(efence, malloc) + AC_CHECK_LIB(dmalloc, dmalloc_debug) + if test $ac_cv_lib_dmalloc_dmalloc_debug != yes ; then + AC_CHECK_LIB(efence, malloc) + fi else AC_DEFINE_UNQUOTED(PATH_CONFIG_DIR, "$sysconfdir") fi diff --git a/lib/resource.c b/lib/resource.c index ce0ba14b..f2a0c773 100644 --- a/lib/resource.c +++ b/lib/resource.c @@ -8,6 +8,7 @@ #include #include +#include #include "nest/bird.h" #include "lib/resource.h" @@ -156,6 +157,14 @@ mb_alloc(pool *p, unsigned size) return b->data; } +void * +mb_allocz(pool *p, unsigned size) +{ + void *x = mb_alloc(p, size); + bzero(x, size); + return x; +} + void mb_free(void *m) { diff --git a/lib/resource.h b/lib/resource.h index 6a50c331..1d83b07f 100644 --- a/lib/resource.h +++ b/lib/resource.h @@ -43,6 +43,7 @@ extern pool root_pool; /* Normal memory blocks */ void *mb_alloc(pool *, unsigned size); +void *mb_allocz(pool *, unsigned size); void mb_free(void *); /* Memory pools with linear allocation */ @@ -62,9 +63,24 @@ slab *sl_new(pool *, unsigned size); void *sl_alloc(slab *); void sl_free(slab *, void *); -/* Low-level memory allocation functions, please don't use */ +/* + * Low-level memory allocation functions, please don't use + * outside resource manager and possibly sysdep code. + */ +#ifdef HAVE_LIBDMALLOC +/* + * The standard dmalloc macros tend to produce lots of namespace + * conflicts and we use only xmalloc and xfree, so we can define + * the stubs ourselves. + */ +#define DMALLOC_DISABLE +#include +#define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size) +#define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr) +#else void *xmalloc(unsigned); #define xfree(x) free(x) +#endif #endif diff --git a/lib/xmalloc.c b/lib/xmalloc.c index c1ce7ea3..2bec260c 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -1,7 +1,7 @@ /* * BIRD Library -- malloc() With Checking * - * (c) 1998 Martin Mares + * (c) 1998--1999 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -11,6 +11,8 @@ #include "nest/bird.h" #include "lib/resource.h" +#ifndef HAVE_LIBDMALLOC + void * xmalloc(unsigned size) { @@ -19,3 +21,5 @@ xmalloc(unsigned size) return p; die("Unable to allocate %d bytes of memory", size); } + +#endif diff --git a/sysdep/autoconf.h.in b/sysdep/autoconf.h.in index a1ef2f84..ae4d6b65 100644 --- a/sysdep/autoconf.h.in +++ b/sysdep/autoconf.h.in @@ -40,3 +40,6 @@ /* Path to configuration files */ #define PATH_CONFIG_DIR ? + +/* Are we using dmalloc? */ +#undef HAVE_LIBDMALLOC diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index e5e9934c..45940fb9 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -186,6 +187,11 @@ parse_args(int argc, char **argv) int main(int argc, char **argv) { +#ifdef HAVE_LIBDMALLOC + if (!getenv("DMALLOC_OPTIONS")) + dmalloc_debug(0x2f03d00); +#endif + log_init_debug(NULL); parse_args(argc, argv); diff --git a/tools/Makefile.in b/tools/Makefile.in index 246872c0..ce649d6b 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -14,7 +14,7 @@ subdir depend: set -e ; for a in $(static-dirs) ; do $(MAKE) -C $$a -f $(srcdir_abs)/$$a/Makefile $@ ; done $(exedir)/bird: $(addsuffix /all.o, $(static-dirs)) conf/all.o lib/birdlib.a - $(CC) $(LDFLAGS) -o $@ $^ + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) .dir-stamp: mkdir -p $(static-dirs) diff --git a/tools/Rules.in b/tools/Rules.in index 36a6eece..271a4eca 100644 --- a/tools/Rules.in +++ b/tools/Rules.in @@ -18,7 +18,8 @@ dir-objs:=$(addprefix $(objdir)/,$(all-dirs)) CPPFLAGS=-I$(root-rel) -I$(srcdir) CFLAGS=$(CPPFLAGS) @CFLAGS@ -LDFLAGS=@LIBS@ +LDFLAGS= +LIBS=@LIBS@ CC=@CC@ M4=@M4@ BISON=@BISON@