From 76ee03dea8ff0a04d7659ded5a9a53ef3eb39aa7 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Mon, 11 Dec 2000 22:57:04 +0000 Subject: [PATCH] Added support for memory debuggers (efence and [untested] dmalloc), just enable in the top-level Makefile. All modules should use xmalloc/xrealloc/xfree (or memory pools) to allocate their data. These functions automatically check for errors and they also translate to dmalloc calls if needed. --- lib/db-emul.c | 8 ++++---- lib/db.c | 2 +- lib/fastbuf.c | 2 +- lib/fb-mem.c | 4 ++-- lib/lib.h | 25 +++++++++++++++++++++++-- lib/pagecache.c | 6 +++--- lib/pool.c | 8 ++++---- lib/regex.c | 4 ++-- 8 files changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/db-emul.c b/lib/db-emul.c index a8d88743..f988741e 100644 --- a/lib/db-emul.c +++ b/lib/db-emul.c @@ -39,7 +39,7 @@ sdbm_close(struct sdbm *d) { sdbm_rewind(d); gdbm_close(d->db); - free(d); + xfree(d); } static int @@ -110,7 +110,7 @@ sdbm_fetch(struct sdbm *d, byte *key, uns keylen, byte *val, uns *vallen) if (!V.dptr) return 0; rc = sdbm_put_user(V.dptr, V.dsize, val, vallen); - free(V.dptr); + xfree(V.dptr); return rc ? SDBM_ERROR_TOO_LARGE : 1; } @@ -119,7 +119,7 @@ sdbm_rewind(struct sdbm *d) { if (d->prevkey.dptr) { - free(d->prevkey.dptr); + xfree(d->prevkey.dptr); d->prevkey.dptr = NULL; } } @@ -132,7 +132,7 @@ sdbm_get_next(struct sdbm *d, byte *key, uns *keylen, byte *val, uns *vallen) if (d->prevkey.dptr) { K = gdbm_nextkey(d->db, d->prevkey); - free(d->prevkey.dptr); + xfree(d->prevkey.dptr); } else K = gdbm_firstkey(d->db); diff --git a/lib/db.c b/lib/db.c index 84eaef18..46e6ba56 100644 --- a/lib/db.c +++ b/lib/db.c @@ -102,7 +102,7 @@ sdbm_close(struct sdbm *d) pgc_close(d->cache); if (d->fd >= 0) close(d->fd); - free(d); + xfree(d); } static uns diff --git a/lib/fastbuf.c b/lib/fastbuf.c index 1be1b576..0939b6d5 100644 --- a/lib/fastbuf.c +++ b/lib/fastbuf.c @@ -14,7 +14,7 @@ void bclose(struct fastbuf *f) { bflush(f); f->close(f); - free(f); + xfree(f); } void bflush(struct fastbuf *f) diff --git a/lib/fb-mem.c b/lib/fb-mem.c index e83e2ebc..2e0769a4 100644 --- a/lib/fb-mem.c +++ b/lib/fb-mem.c @@ -115,9 +115,9 @@ fbmem_close(struct fastbuf *f) while (b = m->first) { m->first = b->next; - free(b); + xfree(b); } - free(m); + xfree(m); } struct fastbuf * diff --git a/lib/lib.h b/lib/lib.h index 2fb56d95..7e4a3b56 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -74,8 +74,29 @@ void open_log_file(byte *); /* Allocation */ -void *xmalloc(uns); -void *xrealloc(void *, uns); +#ifdef DMALLOC +/* + * 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 xrealloc(ptr,size) _xrealloc_leap(__FILE__, __LINE__, ptr, size) +#define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr) +#else +/* + * Unfortunately, several libraries we might want to link to define + * their own xmalloc and we don't want to interfere with them, hence + * the renaming. + */ +#define xmalloc bird_xmalloc +void *xmalloc(unsigned); +void *xrealloc(void *, unsigned); +#define xfree(x) free(x) +#endif + byte *stralloc(byte *); /* Content-Type pattern matching and filters */ diff --git a/lib/pagecache.c b/lib/pagecache.c index 5acbca4b..e3257fe2 100644 --- a/lib/pagecache.c +++ b/lib/pagecache.c @@ -65,8 +65,8 @@ pgc_close(struct page_cache *c) ASSERT(EMPTY_LIST(c->locked_pages)); ASSERT(EMPTY_LIST(c->dirty_pages)); ASSERT(EMPTY_LIST(c->free_pages)); - free(c->hash_table); - free(c); + xfree(c->hash_table); + xfree(c); } static void @@ -251,7 +251,7 @@ pgc_cleanup(struct page_cache *c) rem_node(&p->hn); c->free_count--; c->total_count--; - free(p); + xfree(p); } ASSERT(!c->free_count); } diff --git a/lib/pool.c b/lib/pool.c index a7d6f5b0..b4783e87 100644 --- a/lib/pool.c +++ b/lib/pool.c @@ -36,14 +36,14 @@ free_pool(struct mempool *p) for(d=p->first; d; d = c) { c = d->next; - free(d); + xfree(d); } for(d=p->first_large; d; d = c) { c = d->next; - free(d); + xfree(d); } - free(p); + xfree(p); } void @@ -56,7 +56,7 @@ flush_pool(struct mempool *p) while (c = p->first_large) { p->first_large = c->next; - free(c); + xfree(c); } } diff --git a/lib/regex.c b/lib/regex.c index d321172a..8cc9d287 100644 --- a/lib/regex.c +++ b/lib/regex.c @@ -37,8 +37,8 @@ rx_compile(byte *p) void rx_free(regex *r) { - free(r->buf.buffer); - free(r); + xfree(r->buf.buffer); + xfree(r); } int -- 2.39.5