2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

1885. [func] Additional memory debugging support to track size

and mctx arguements. [RT #14814]
This commit is contained in:
Mark Andrews
2005-06-10 07:00:20 +00:00
parent e8e62bb782
commit d4d68515d2
5 changed files with 109 additions and 11 deletions

View File

@@ -1,3 +1,6 @@
1885. [func] Additional memory debugging support to track size
and mctx arguements. [RT #14814]
1884. [bug] process_dhtkey() was using the wrong memory context 1884. [bug] process_dhtkey() was using the wrong memory context
to free some memory. [RT #14890] to free some memory. [RT #14890]

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: main.c,v 1.146 2005/04/29 00:36:15 marka Exp $ */ /* $Id: main.c,v 1.147 2005/06/10 07:00:19 marka Exp $ */
/*! \file */ /*! \file */
@@ -228,7 +228,7 @@ lwresd_usage(void) {
" [-f|-g] [-n number_of_cpus] [-p port] " " [-f|-g] [-n number_of_cpus] [-p port] "
"[-P listen-port] [-s]\n" "[-P listen-port] [-s]\n"
" [-t chrootdir] [-u username] [-i pidfile]\n" " [-t chrootdir] [-u username] [-i pidfile]\n"
" [-m {usage|trace|record}]\n"); " [-m {usage|trace|record|size|mctx}]\n");
} }
static void static void
@@ -241,7 +241,7 @@ usage(void) {
"usage: named [-4|-6] [-c conffile] [-d debuglevel] " "usage: named [-4|-6] [-c conffile] [-d debuglevel] "
"[-f|-g] [-n number_of_cpus]\n" "[-f|-g] [-n number_of_cpus]\n"
" [-p port] [-s] [-t chrootdir] [-u username]\n" " [-p port] [-s] [-t chrootdir] [-u username]\n"
" [-m {usage|trace|record}]\n"); " [-m {usage|trace|record|size|mctx}]\n");
} }
static void static void
@@ -309,6 +309,8 @@ static struct flag_def {
{ "trace", ISC_MEM_DEBUGTRACE }, { "trace", ISC_MEM_DEBUGTRACE },
{ "record", ISC_MEM_DEBUGRECORD }, { "record", ISC_MEM_DEBUGRECORD },
{ "usage", ISC_MEM_DEBUGUSAGE }, { "usage", ISC_MEM_DEBUGUSAGE },
{ "size", ISC_MEM_DEBUGSIZE },
{ "mctx", ISC_MEM_DEBUGCTX },
{ NULL, 0 } { NULL, 0 }
}; };

View File

@@ -15,7 +15,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE. # PERFORMANCE OF THIS SOFTWARE.
# $Id: start.pl,v 1.5 2004/03/10 02:19:52 marka Exp $ # $Id: start.pl,v 1.6 2005/06/10 07:00:19 marka Exp $
# Framework for starting test servers. # Framework for starting test servers.
# Based on the type of server specified, check for port availability, remove # Based on the type of server specified, check for port availability, remove
@@ -129,7 +129,7 @@ sub start_server {
if ($options) { if ($options) {
$command .= "$options"; $command .= "$options";
} else { } else {
$command .= "-m record -c named.conf -d 99 -g"; $command .= "-m record,size,mctx -c named.conf -d 99 -g";
} }
$command .= " >named.run 2>&1 &"; $command .= " >named.run 2>&1 &";
$pid_file = "named.pid"; $pid_file = "named.pid";
@@ -139,7 +139,7 @@ sub start_server {
if ($options) { if ($options) {
$command .= "$options"; $command .= "$options";
} else { } else {
$command .= "-m record -C resolv.conf -d 99 -g -i lwresd.pid -P 9210 -p 5300"; $command .= "-m record,size,mctx -C resolv.conf -d 99 -g -i lwresd.pid -P 9210 -p 5300";
} }
$command .= " >lwresd.run 2>&1 &"; $command .= " >lwresd.run 2>&1 &";
$pid_file = "lwresd.pid"; $pid_file = "lwresd.pid";

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: mem.h,v 1.63 2005/06/04 05:32:48 jinmei Exp $ */ /* $Id: mem.h,v 1.64 2005/06/10 07:00:20 marka Exp $ */
#ifndef ISC_MEM_H #ifndef ISC_MEM_H
#define ISC_MEM_H 1 #define ISC_MEM_H 1
@@ -87,6 +87,9 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
#define ISC_MEM_DEBUGTRACE 0x00000001U #define ISC_MEM_DEBUGTRACE 0x00000001U
#define ISC_MEM_DEBUGRECORD 0x00000002U #define ISC_MEM_DEBUGRECORD 0x00000002U
#define ISC_MEM_DEBUGUSAGE 0x00000004U #define ISC_MEM_DEBUGUSAGE 0x00000004U
#define ISC_MEM_DEBUGSIZE 0x00000008U
#define ISC_MEM_DEBUGCTX 0x00000010U
#define ISC_MEM_DEBUGALL 0x0000001FU
/*!< /*!<
* The variable isc_mem_debugging holds a set of flags for * The variable isc_mem_debugging holds a set of flags for
* turning certain memory debugging options on or off at * turning certain memory debugging options on or off at
@@ -104,6 +107,14 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
* \li #ISC_MEM_DEBUGUSAGE * \li #ISC_MEM_DEBUGUSAGE
* If a hi_water mark is set, print the maximium inuse memory * If a hi_water mark is set, print the maximium inuse memory
* every time it is raised once it exceeds the hi_water mark. * every time it is raised once it exceeds the hi_water mark.
*
* \li #ISC_MEM_DEBUGSIZE
* Check the size arguement being passed to isc_mem_put() matches
* that passed to isc_mem_get().
*
* \li #ISC_MEM_DEBUGCTX
* Check the mctx arguement being passed to isc_mem_put() matches
* that passed to isc_mem_get().
*/ */
/*@}*/ /*@}*/

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: mem.c,v 1.120 2005/06/04 05:32:48 jinmei Exp $ */ /* $Id: mem.c,v 1.121 2005/06/10 07:00:19 marka Exp $ */
/*! \file */ /*! \file */
@@ -99,6 +99,7 @@ typedef struct {
*/ */
union { union {
size_t size; size_t size;
isc_mem_t *ctx;
char bytes[ALIGNMENT_SIZE]; char bytes[ALIGNMENT_SIZE];
} u; } u;
} size_info; } size_info;
@@ -976,6 +977,8 @@ void
isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) { isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
isc_mem_t *ctx; isc_mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE; isc_boolean_t want_destroy = ISC_FALSE;
size_info *si;
size_t oldsize;
REQUIRE(ctxp != NULL); REQUIRE(ctxp != NULL);
ctx = *ctxp; ctx = *ctxp;
@@ -988,6 +991,26 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
*/ */
*ctxp = NULL; *ctxp = NULL;
if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0) {
if ((isc_mem_debugging & ISC_MEM_DEBUGSIZE) != 0) {
si = &(((size_info *)ptr)[-1]);
oldsize = si->u.size - ALIGNMENT_SIZE;
if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
isc__mem_free(ctx, ptr FLARG_PASS);
MCTXLOCK(ctx, &ctx->lock);
ctx->references--;
if (ctx->references == 0)
want_destroy = ISC_TRUE;
MCTXUNLOCK(ctx, &ctx->lock);
if (want_destroy)
destroy(ctx);
return;
}
#if ISC_MEM_USE_INTERNAL_MALLOC #if ISC_MEM_USE_INTERNAL_MALLOC
MCTXLOCK(ctx, &ctx->lock); MCTXLOCK(ctx, &ctx->lock);
mem_putunlocked(ctx, ptr, size); mem_putunlocked(ctx, ptr, size);
@@ -1055,6 +1078,8 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
REQUIRE(VALID_CONTEXT(ctx)); REQUIRE(VALID_CONTEXT(ctx));
if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0)
return (isc__mem_allocate(ctx, size FLARG_PASS));
#if ISC_MEM_USE_INTERNAL_MALLOC #if ISC_MEM_USE_INTERNAL_MALLOC
MCTXLOCK(ctx, &ctx->lock); MCTXLOCK(ctx, &ctx->lock);
ptr = mem_getunlocked(ctx, size); ptr = mem_getunlocked(ctx, size);
@@ -1090,10 +1115,24 @@ void
isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG) isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
{ {
isc_boolean_t call_water = ISC_FALSE; isc_boolean_t call_water = ISC_FALSE;
size_info *si;
size_t oldsize;
REQUIRE(VALID_CONTEXT(ctx)); REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL); REQUIRE(ptr != NULL);
if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0) {
if ((isc_mem_debugging & ISC_MEM_DEBUGSIZE) != 0) {
si = &(((size_info *)ptr)[-1]);
oldsize = si->u.size - ALIGNMENT_SIZE;
if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
isc__mem_free(ctx, ptr FLARG_PASS);
return;
}
#if ISC_MEM_USE_INTERNAL_MALLOC #if ISC_MEM_USE_INTERNAL_MALLOC
MCTXLOCK(ctx, &ctx->lock); MCTXLOCK(ctx, &ctx->lock);
mem_putunlocked(ctx, ptr, size); mem_putunlocked(ctx, ptr, size);
@@ -1249,6 +1288,8 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
size_info *si; size_info *si;
size += ALIGNMENT_SIZE; size += ALIGNMENT_SIZE;
if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
size += ALIGNMENT_SIZE;
#if ISC_MEM_USE_INTERNAL_MALLOC #if ISC_MEM_USE_INTERNAL_MALLOC
si = mem_getunlocked(ctx, size); si = mem_getunlocked(ctx, size);
#else /* ISC_MEM_USE_INTERNAL_MALLOC */ #else /* ISC_MEM_USE_INTERNAL_MALLOC */
@@ -1256,6 +1297,10 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
#endif /* ISC_MEM_USE_INTERNAL_MALLOC */ #endif /* ISC_MEM_USE_INTERNAL_MALLOC */
if (si == NULL) if (si == NULL)
return (NULL); return (NULL);
if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0) {
si->u.ctx = ctx;
si++;
}
si->u.size = size; si->u.size = size;
return (&si[1]); return (&si[1]);
} }
@@ -1263,6 +1308,7 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
void * void *
isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) { isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
size_info *si; size_info *si;
isc_boolean_t call_water = ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx)); REQUIRE(VALID_CONTEXT(ctx));
@@ -1279,9 +1325,23 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
#if ISC_MEM_TRACKLINES #if ISC_MEM_TRACKLINES
ADD_TRACE(ctx, si, si[-1].u.size, file, line); ADD_TRACE(ctx, si, si[-1].u.size, file, line);
#endif #endif
if (ctx->hi_water != 0U && !ctx->hi_called &&
ctx->inuse > ctx->hi_water) {
ctx->hi_called = ISC_TRUE;
call_water = ISC_TRUE;
}
if (ctx->inuse > ctx->maxinuse) {
ctx->maxinuse = ctx->inuse;
if (ctx->hi_water != 0U && ctx->inuse > ctx->hi_water &&
(isc_mem_debugging & ISC_MEM_DEBUGUSAGE) != 0)
fprintf(stderr, "maxinuse = %lu\n",
(unsigned long)ctx->inuse);
}
MCTXUNLOCK(ctx, &ctx->lock); MCTXUNLOCK(ctx, &ctx->lock);
if (call_water)
(ctx->water)(ctx->water_arg, ISC_MEM_HIWATER);
return (si); return (si);
} }
@@ -1289,12 +1349,19 @@ void
isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) { isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
size_info *si; size_info *si;
size_t size; size_t size;
isc_boolean_t call_water= ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx)); REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL); REQUIRE(ptr != NULL);
si = &(((size_info *)ptr)[-1]); if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0) {
size = si->u.size; si = &(((size_info *)ptr)[-2]);
REQUIRE(si->u.ctx == ctx);
size = si[1].u.size;
} else {
si = &(((size_info *)ptr)[-1]);
size = si->u.size;
}
#if ISC_MEM_USE_INTERNAL_MALLOC #if ISC_MEM_USE_INTERNAL_MALLOC
MCTXLOCK(ctx, &ctx->lock); MCTXLOCK(ctx, &ctx->lock);
@@ -1307,7 +1374,22 @@ isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
DELETE_TRACE(ctx, ptr, size, file, line); DELETE_TRACE(ctx, ptr, size, file, line);
/*
* The check against ctx->lo_water == 0 is for the condition
* when the context was pushed over hi_water but then had
* isc_mem_setwater() called with 0 for hi_water and lo_water.
*/
if (ctx->hi_called &&
(ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) {
ctx->hi_called = ISC_FALSE;
if (ctx->water != NULL)
call_water = ISC_TRUE;
}
MCTXUNLOCK(ctx, &ctx->lock); MCTXUNLOCK(ctx, &ctx->lock);
if (call_water)
(ctx->water)(ctx->water_arg, ISC_MEM_LOWATER);
} }