#include <isc/mem.h>
#include <isc/msgs.h>
#include <isc/once.h>
+#include <isc/refcount.h>
#include <isc/string.h>
#include <isc/mutex.h>
#include <isc/print.h>
size_t max_size;
bool checkfree;
struct stats * stats;
- unsigned int references;
+ isc_refcount_t references;
char name[16];
void * tag;
size_t quota;
else
ctx->max_size = init_max_size;
ctx->flags = flags;
- ctx->references = 1;
+ isc_refcount_init(&ctx->references, 1);
memset(ctx->name, 0, sizeof(ctx->name));
ctx->tag = NULL;
ctx->quota = 0;
ctx->malloced -= DEBUG_TABLE_COUNT * sizeof(debuglist_t);
}
#endif
- INSIST(ctx->references == 0);
+ isc_refcount_destroy(&ctx->references);
if (ctx->checkfree) {
for (i = 0; i <= ctx->max_size; i++) {
void
isc__mem_attach(isc_mem_t *source0, isc_mem_t **targetp) {
isc__mem_t *source = (isc__mem_t *)source0;
+ int_fast32_t refs;
REQUIRE(VALID_CONTEXT(source));
REQUIRE(targetp != NULL && *targetp == NULL);
- MCTXLOCK(source, &source->lock);
- source->references++;
- MCTXUNLOCK(source, &source->lock);
+ isc_refcount_increment(&source->references, &refs);
*targetp = (isc_mem_t *)source;
}
void
isc__mem_detach(isc_mem_t **ctxp) {
isc__mem_t *ctx;
- bool want_destroy = false;
+ int_fast32_t refs;
REQUIRE(ctxp != NULL);
ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
- MCTXLOCK(ctx, &ctx->lock);
- INSIST(ctx->references > 0);
- ctx->references--;
- if (ctx->references == 0)
- want_destroy = true;
- MCTXUNLOCK(ctx, &ctx->lock);
+ isc_refcount_decrement(&ctx->references, &refs);
- if (want_destroy)
+ if (refs == 0) {
destroy(ctx);
+ }
*ctxp = NULL;
}
void
isc___mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
isc__mem_t *ctx;
- bool want_destroy = false;
size_info *si;
size_t oldsize;
+ int_fast32_t refs;
REQUIRE(ctxp != NULL);
ctx = (isc__mem_t *)*ctxp;
}
isc__mem_free((isc_mem_t *)ctx, ptr FLARG_PASS);
- MCTXLOCK(ctx, &ctx->lock);
- ctx->references--;
- if (ctx->references == 0)
- want_destroy = true;
- MCTXUNLOCK(ctx, &ctx->lock);
- if (want_destroy)
+ isc_refcount_decrement(&ctx->references, &refs);
+
+ if (refs == 0) {
destroy(ctx);
+ }
return;
}
mem_putstats(ctx, ptr, size);
mem_put(ctx, ptr, size);
}
-
- INSIST(ctx->references > 0);
- ctx->references--;
- if (ctx->references == 0)
- want_destroy = true;
-
MCTXUNLOCK(ctx, &ctx->lock);
- if (want_destroy)
+ isc_refcount_decrement(&ctx->references, &refs);
+
+ if (refs == 0) {
destroy(ctx);
+ }
}
void
isc__mem_destroy(isc_mem_t **ctxp) {
isc__mem_t *ctx;
+ int_fast32_t refs;
/*
* This routine provides legacy support for callers who use mctxs
ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
- MCTXLOCK(ctx, &ctx->lock);
+ isc_refcount_decrement(&ctx->references, &refs);
#if ISC_MEM_TRACKLINES
- if (ctx->references != 1)
+ if (refs >= 1) {
print_active(ctx, stderr);
+ }
#endif
- REQUIRE(ctx->references == 1);
- ctx->references--;
- MCTXUNLOCK(ctx, &ctx->lock);
-
+ isc_refcount_destroy(&ctx->references);
destroy(ctx);
*ctxp = NULL;
ctx != NULL;
ctx = ISC_LIST_NEXT(ctx, link))
{
- fprintf(file, "context: %p (%s): %u references\n",
+ fprintf(file, "context: %p (%s): %" PRIdFAST32 " references\n",
ctx,
ctx->name[0] == 0 ? "<unknown>" : ctx->name,
- ctx->references);
+ isc_refcount_current(&ctx->references));
print_active(ctx, file);
}
fflush(file);
unsigned int
isc_mem_references(isc_mem_t *ctx0) {
isc__mem_t *ctx = (isc__mem_t *)ctx0;
- unsigned int references;
-
- REQUIRE(VALID_CONTEXT(ctx));
-
- MCTXLOCK(ctx, &ctx->lock);
- references = ctx->references;
- MCTXUNLOCK(ctx, &ctx->lock);
-
- return (references);
+ return (isc_refcount_current(&ctx->references));
}
typedef struct summarystat {
}
#endif
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", ctx->references));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%" PRIdFAST32,
+ isc_refcount_current(&ctx->references)));
TRY0(xmlTextWriterEndElement(writer)); /* references */
summary->total += ctx->total;
json_object_object_add(ctxobj, "name", obj);
}
- obj = json_object_new_int64(ctx->references);
+ obj = json_object_new_int64(isc_refcount_current(&ctx->references));
CHECKMEM(obj);
json_object_object_add(ctxobj, "references", obj);