summaryrefslogtreecommitdiffstats
path: root/lib/isc/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/isc/mem.c')
-rw-r--r--lib/isc/mem.c199
1 files changed, 116 insertions, 83 deletions
diff --git a/lib/isc/mem.c b/lib/isc/mem.c
index 1964b7a..20fec46 100644
--- a/lib/isc/mem.c
+++ b/lib/isc/mem.c
@@ -202,6 +202,7 @@ struct isc__mempool {
#if ! ISC_MEM_TRACKLINES
#define ADD_TRACE(a, b, c, d, e)
#define DELETE_TRACE(a, b, c, d, e)
+#define ISC_MEMFUNC_SCOPE
#else
#define ADD_TRACE(a, b, c, d, e) \
do { \
@@ -321,6 +322,7 @@ isc__mem_checkdestroyed(FILE *file);
ISC_MEMFUNC_SCOPE unsigned int
isc__mem_references(isc_mem_t *ctx0);
#endif
+#endif /* ISC_MEM_TRACKLINES */
static struct isc__memmethods {
isc_memmethods_t methods;
@@ -389,6 +391,7 @@ static struct isc__mempoolmethods {
#endif
};
+#if ISC_MEM_TRACKLINES
/*!
* mctx must be locked.
*/
@@ -1478,7 +1481,12 @@ isc__mem_stats(isc_mem_t *ctx0, FILE *out) {
}
while (pool != NULL) {
fprintf(out, "%15s %10lu %10u %10u %10u %10u %10u %10u %s\n",
- pool->name, (unsigned long) pool->size, pool->maxalloc,
+#if ISC_MEMPOOL_NAMES
+ pool->name,
+#else
+ "(not tracked)",
+#endif
+ (unsigned long) pool->size, pool->maxalloc,
pool->allocated, pool->freecount, pool->freemax,
pool->fillcount, pool->gets,
(pool->lock == NULL ? "N" : "Y"));
@@ -2260,16 +2268,16 @@ isc__mem_register() {
#ifdef BIND9
ISC_MEMFUNC_SCOPE void
isc__mem_printactive(isc_mem_t *ctx0, FILE *file) {
+#if ISC_MEM_TRACKLINES
isc__mem_t *ctx = (isc__mem_t *)ctx0;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(file != NULL);
-#if !ISC_MEM_TRACKLINES
- UNUSED(ctx);
- UNUSED(file);
-#else
print_active(ctx, file);
+#else
+ UNUSED(ctx0);
+ UNUSED(file);
#endif
}
@@ -2295,6 +2303,9 @@ isc__mem_printallactive(FILE *file) {
ISC_MEMFUNC_SCOPE void
isc__mem_checkdestroyed(FILE *file) {
+#if !ISC_MEM_TRACKLINES
+ UNUSED(file);
+#endif
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
@@ -2339,25 +2350,27 @@ typedef struct summarystat {
isc_uint64_t contextsize;
} summarystat_t;
-static void
+#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
+static int
renderctx(isc__mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
+ int xmlrc;
+
REQUIRE(VALID_CONTEXT(ctx));
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "context");
+ MCTXLOCK(ctx, &ctx->lock);
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "context"));
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "id");
- xmlTextWriterWriteFormatString(writer, "%p", ctx);
- xmlTextWriterEndElement(writer); /* id */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%p", ctx));
+ TRY0(xmlTextWriterEndElement(writer)); /* id */
if (ctx->name[0] != 0) {
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "name");
- xmlTextWriterWriteFormatString(writer, "%s", ctx->name);
- xmlTextWriterEndElement(writer); /* name */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%s", ctx->name));
+ TRY0(xmlTextWriterEndElement(writer)); /* name */
}
- REQUIRE(VALID_CONTEXT(ctx));
- MCTXLOCK(ctx, &ctx->lock);
-
summary->contextsize += sizeof(*ctx) +
(ctx->max_size + 1) * sizeof(struct stats) +
ctx->max_size * sizeof(element *) +
@@ -2369,70 +2382,79 @@ renderctx(isc__mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
ctx->debuglistcnt * sizeof(debuglink_t);
}
#endif
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "references");
- xmlTextWriterWriteFormatString(writer, "%d", ctx->references);
- xmlTextWriterEndElement(writer); /* references */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%d", ctx->references));
+ TRY0(xmlTextWriterEndElement(writer)); /* references */
summary->total += ctx->total;
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "total");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- (isc_uint64_t)ctx->total);
- xmlTextWriterEndElement(writer); /* total */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "total"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ (isc_uint64_t)ctx->total));
+ TRY0(xmlTextWriterEndElement(writer)); /* total */
summary->inuse += ctx->inuse;
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "inuse");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- (isc_uint64_t)ctx->inuse);
- xmlTextWriterEndElement(writer); /* inuse */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxinuse");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- (isc_uint64_t)ctx->maxinuse);
- xmlTextWriterEndElement(writer); /* maxinuse */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "blocksize");
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "inuse"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ (isc_uint64_t)ctx->inuse));
+ TRY0(xmlTextWriterEndElement(writer)); /* inuse */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxinuse"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ (isc_uint64_t)ctx->maxinuse));
+ TRY0(xmlTextWriterEndElement(writer)); /* maxinuse */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "blocksize"));
if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
summary->blocksize += ctx->basic_table_count *
NUM_BASIC_BLOCKS * ctx->mem_target;
- xmlTextWriterWriteFormatString(writer,
+ TRY0(xmlTextWriterWriteFormatString(writer,
"%" ISC_PRINT_QUADFORMAT "u",
(isc_uint64_t)
ctx->basic_table_count *
NUM_BASIC_BLOCKS *
- ctx->mem_target);
+ ctx->mem_target));
} else
- xmlTextWriterWriteFormatString(writer, "%s", "-");
- xmlTextWriterEndElement(writer); /* blocksize */
+ TRY0(xmlTextWriterWriteFormatString(writer, "%s", "-"));
+ TRY0(xmlTextWriterEndElement(writer)); /* blocksize */
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools");
- xmlTextWriterWriteFormatString(writer, "%u", ctx->poolcnt);
- xmlTextWriterEndElement(writer); /* pools */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%u", ctx->poolcnt));
+ TRY0(xmlTextWriterEndElement(writer)); /* pools */
summary->contextsize += ctx->poolcnt * sizeof(isc_mempool_t);
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "hiwater");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- (isc_uint64_t)ctx->hi_water);
- xmlTextWriterEndElement(writer); /* hiwater */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "hiwater"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ (isc_uint64_t)ctx->hi_water));
+ TRY0(xmlTextWriterEndElement(writer)); /* hiwater */
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "lowater");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- (isc_uint64_t)ctx->lo_water);
- xmlTextWriterEndElement(writer); /* lowater */
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "lowater"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ (isc_uint64_t)ctx->lo_water));
+ TRY0(xmlTextWriterEndElement(writer)); /* lowater */
+ TRY0(xmlTextWriterEndElement(writer)); /* context */
+
+ error:
MCTXUNLOCK(ctx, &ctx->lock);
- xmlTextWriterEndElement(writer); /* context */
+ return (xmlrc);
}
-void
+int
isc_mem_renderxml(xmlTextWriterPtr writer) {
isc__mem_t *ctx;
summarystat_t summary;
isc_uint64_t lost;
+ int xmlrc;
memset(&summary, 0, sizeof(summary));
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "contexts");
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "contexts"));
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
@@ -2441,40 +2463,51 @@ isc_mem_renderxml(xmlTextWriterPtr writer) {
for (ctx = ISC_LIST_HEAD(contexts);
ctx != NULL;
ctx = ISC_LIST_NEXT(ctx, link)) {
- renderctx(ctx, &summary, writer);
+ xmlrc = renderctx(ctx, &summary, writer);
+ if (xmlrc < 0) {
+ UNLOCK(&lock);
+ goto error;
+ }
}
UNLOCK(&lock);
- xmlTextWriterEndElement(writer); /* contexts */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "summary");
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "TotalUse");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- summary.total);
- xmlTextWriterEndElement(writer); /* TotalUse */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "InUse");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- summary.inuse);
- xmlTextWriterEndElement(writer); /* InUse */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "BlockSize");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- summary.blocksize);
- xmlTextWriterEndElement(writer); /* BlockSize */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "ContextSize");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- summary.contextsize);
- xmlTextWriterEndElement(writer); /* ContextSize */
-
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "Lost");
- xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u",
- lost);
- xmlTextWriterEndElement(writer); /* Lost */
-
- xmlTextWriterEndElement(writer); /* summary */
+ TRY0(xmlTextWriterEndElement(writer)); /* contexts */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "summary"));
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "TotalUse"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ summary.total));
+ TRY0(xmlTextWriterEndElement(writer)); /* TotalUse */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "InUse"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ summary.inuse));
+ TRY0(xmlTextWriterEndElement(writer)); /* InUse */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "BlockSize"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ summary.blocksize));
+ TRY0(xmlTextWriterEndElement(writer)); /* BlockSize */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "ContextSize"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ summary.contextsize));
+ TRY0(xmlTextWriterEndElement(writer)); /* ContextSize */
+
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "Lost"));
+ TRY0(xmlTextWriterWriteFormatString(writer,
+ "%" ISC_PRINT_QUADFORMAT "u",
+ lost));
+ TRY0(xmlTextWriterEndElement(writer)); /* Lost */
+
+ TRY0(xmlTextWriterEndElement(writer)); /* summary */
+ error:
+ return (xmlrc);
}
#endif /* HAVE_LIBXML2 */
OpenPOWER on IntegriCloud