1224090Sdougb/* 2224090Sdougb * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") 3224090Sdougb * 4224090Sdougb * Permission to use, copy, modify, and/or distribute this software for any 5224090Sdougb * purpose with or without fee is hereby granted, provided that the above 6224090Sdougb * copyright notice and this permission notice appear in all copies. 7224090Sdougb * 8224090Sdougb * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9224090Sdougb * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10224090Sdougb * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11224090Sdougb * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12224090Sdougb * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13224090Sdougb * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14224090Sdougb * PERFORMANCE OF THIS SOFTWARE. 15224090Sdougb */ 16224090Sdougb 17234010Sdougb/* $Id: mem_api.c,v 1.8 2010/08/12 21:30:26 jinmei Exp $ */ 18224090Sdougb 19224090Sdougb#include <config.h> 20224090Sdougb 21224090Sdougb#include <isc/magic.h> 22224090Sdougb#include <isc/mem.h> 23224090Sdougb#include <isc/once.h> 24224090Sdougb#include <isc/util.h> 25224090Sdougb 26224090Sdougb#if ISC_MEM_TRACKLINES 27224090Sdougb#define FLARG_PASS , file, line 28224090Sdougb#define FLARG , const char *file, unsigned int line 29224090Sdougb#else 30224090Sdougb#define FLARG_PASS 31224090Sdougb#define FLARG 32224090Sdougb#endif 33224090Sdougb 34224090Sdougbstatic isc_mutex_t createlock; 35224090Sdougbstatic isc_once_t once = ISC_ONCE_INIT; 36224090Sdougbstatic isc_memcreatefunc_t mem_createfunc = NULL; 37224090Sdougb 38224090Sdougbstatic void 39224090Sdougbinitialize(void) { 40224090Sdougb RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS); 41224090Sdougb} 42224090Sdougb 43224090Sdougbisc_result_t 44224090Sdougbisc_mem_register(isc_memcreatefunc_t createfunc) { 45224090Sdougb isc_result_t result = ISC_R_SUCCESS; 46224090Sdougb 47224090Sdougb RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS); 48224090Sdougb 49224090Sdougb LOCK(&createlock); 50224090Sdougb if (mem_createfunc == NULL) 51224090Sdougb mem_createfunc = createfunc; 52224090Sdougb else 53224090Sdougb result = ISC_R_EXISTS; 54224090Sdougb UNLOCK(&createlock); 55224090Sdougb 56224090Sdougb return (result); 57224090Sdougb} 58224090Sdougb 59224090Sdougbisc_result_t 60224090Sdougbisc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) { 61224090Sdougb isc_result_t result; 62224090Sdougb 63224090Sdougb LOCK(&createlock); 64224090Sdougb 65224090Sdougb REQUIRE(mem_createfunc != NULL); 66224090Sdougb result = (*mem_createfunc)(init_max_size, target_size, mctxp, 67224090Sdougb ISC_MEMFLAG_DEFAULT); 68224090Sdougb 69224090Sdougb UNLOCK(&createlock); 70224090Sdougb 71224090Sdougb return (result); 72224090Sdougb} 73224090Sdougb 74224090Sdougbisc_result_t 75224090Sdougbisc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp, 76224090Sdougb unsigned int flags) 77224090Sdougb{ 78224090Sdougb isc_result_t result; 79224090Sdougb 80224090Sdougb LOCK(&createlock); 81224090Sdougb 82224090Sdougb REQUIRE(mem_createfunc != NULL); 83224090Sdougb result = (*mem_createfunc)(init_max_size, target_size, mctxp, flags); 84224090Sdougb 85224090Sdougb UNLOCK(&createlock); 86224090Sdougb 87224090Sdougb return (result); 88224090Sdougb} 89224090Sdougb 90224090Sdougbvoid 91224090Sdougbisc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) { 92224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(source)); 93224090Sdougb REQUIRE(targetp != NULL && *targetp == NULL); 94224090Sdougb 95224090Sdougb source->methods->attach(source, targetp); 96224090Sdougb 97224090Sdougb ENSURE(*targetp == source); 98224090Sdougb} 99224090Sdougb 100224090Sdougbvoid 101224090Sdougbisc_mem_detach(isc_mem_t **mctxp) { 102224090Sdougb REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 103224090Sdougb 104224090Sdougb (*mctxp)->methods->detach(mctxp); 105224090Sdougb 106224090Sdougb ENSURE(*mctxp == NULL); 107224090Sdougb} 108224090Sdougb 109224090Sdougbvoid 110224090Sdougbisc_mem_destroy(isc_mem_t **mctxp) { 111224090Sdougb REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 112224090Sdougb 113224090Sdougb (*mctxp)->methods->destroy(mctxp); 114224090Sdougb 115224090Sdougb ENSURE(*mctxp == NULL); 116224090Sdougb} 117224090Sdougb 118224090Sdougbvoid * 119224090Sdougbisc__mem_get(isc_mem_t *mctx, size_t size FLARG) { 120224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 121224090Sdougb 122224090Sdougb return (mctx->methods->memget(mctx, size FLARG_PASS)); 123224090Sdougb} 124224090Sdougb 125224090Sdougbvoid 126224090Sdougbisc__mem_put(isc_mem_t *mctx, void *ptr, size_t size FLARG) { 127224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 128224090Sdougb 129224090Sdougb mctx->methods->memput(mctx, ptr, size FLARG_PASS); 130224090Sdougb} 131224090Sdougb 132224090Sdougbvoid 133224090Sdougbisc__mem_putanddetach(isc_mem_t **mctxp, void *ptr, size_t size FLARG) { 134224090Sdougb REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 135224090Sdougb 136224090Sdougb (*mctxp)->methods->memputanddetach(mctxp, ptr, size FLARG_PASS); 137224090Sdougb 138224090Sdougb /* 139224090Sdougb * XXX: We cannot always ensure *mctxp == NULL here 140224090Sdougb * (see lib/isc/mem.c). 141224090Sdougb */ 142224090Sdougb} 143224090Sdougb 144224090Sdougbvoid * 145224090Sdougbisc__mem_allocate(isc_mem_t *mctx, size_t size FLARG) { 146224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 147224090Sdougb 148224090Sdougb return (mctx->methods->memallocate(mctx, size FLARG_PASS)); 149224090Sdougb} 150224090Sdougb 151224090Sdougbvoid * 152224090Sdougbisc__mem_reallocate(isc_mem_t *mctx, void *ptr, size_t size FLARG) { 153224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 154224090Sdougb 155224090Sdougb return (mctx->methods->memreallocate(mctx, ptr, size FLARG_PASS)); 156224090Sdougb} 157224090Sdougb 158224090Sdougbchar * 159224090Sdougbisc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) { 160224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 161224090Sdougb 162224090Sdougb return (mctx->methods->memstrdup(mctx, s FLARG_PASS)); 163224090Sdougb} 164224090Sdougb 165224090Sdougbvoid 166224090Sdougbisc__mem_free(isc_mem_t *mctx, void *ptr FLARG) { 167224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 168224090Sdougb 169224090Sdougb mctx->methods->memfree(mctx, ptr FLARG_PASS); 170224090Sdougb} 171224090Sdougb 172224090Sdougbvoid 173224090Sdougbisc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t flag) { 174224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 175224090Sdougb 176224090Sdougb mctx->methods->setdestroycheck(mctx, flag); 177224090Sdougb} 178224090Sdougb 179224090Sdougbvoid 180224090Sdougbisc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg, 181224090Sdougb size_t hiwater, size_t lowater) 182224090Sdougb{ 183224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(ctx)); 184224090Sdougb 185224090Sdougb ctx->methods->setwater(ctx, water, water_arg, hiwater, lowater); 186224090Sdougb} 187224090Sdougb 188224090Sdougbvoid 189224090Sdougbisc_mem_waterack(isc_mem_t *ctx, int flag) { 190224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(ctx)); 191224090Sdougb 192224090Sdougb ctx->methods->waterack(ctx, flag); 193224090Sdougb} 194224090Sdougb 195224090Sdougbsize_t 196224090Sdougbisc_mem_inuse(isc_mem_t *mctx) { 197224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 198224090Sdougb 199224090Sdougb return (mctx->methods->inuse(mctx)); 200224090Sdougb} 201224090Sdougb 202224090Sdougbisc_boolean_t 203224090Sdougbisc_mem_isovermem(isc_mem_t *mctx) { 204224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 205224090Sdougb 206224090Sdougb return (mctx->methods->isovermem(mctx)); 207224090Sdougb} 208224090Sdougb 209224090Sdougbvoid 210224090Sdougbisc_mem_setname(isc_mem_t *mctx, const char *name, void *tag) { 211224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 212224090Sdougb 213224090Sdougb UNUSED(name); 214224090Sdougb UNUSED(tag); 215224090Sdougb 216224090Sdougb return; 217224090Sdougb} 218224090Sdougb 219224090Sdougbconst char * 220224090Sdougbisc_mem_getname(isc_mem_t *mctx) { 221224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 222224090Sdougb 223224090Sdougb return (""); 224224090Sdougb} 225224090Sdougb 226224090Sdougbvoid * 227224090Sdougbisc_mem_gettag(isc_mem_t *mctx) { 228224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 229224090Sdougb 230224090Sdougb return (NULL); 231224090Sdougb} 232224090Sdougb 233224090Sdougbisc_result_t 234224090Sdougbisc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) { 235224090Sdougb REQUIRE(ISCAPI_MCTX_VALID(mctx)); 236224090Sdougb 237224090Sdougb return (mctx->methods->mpcreate(mctx, size, mpctxp)); 238224090Sdougb} 239224090Sdougb 240224090Sdougbvoid 241224090Sdougbisc_mempool_destroy(isc_mempool_t **mpctxp) { 242224090Sdougb REQUIRE(mpctxp != NULL && ISCAPI_MPOOL_VALID(*mpctxp)); 243224090Sdougb 244224090Sdougb (*mpctxp)->methods->destroy(mpctxp); 245224090Sdougb 246224090Sdougb ENSURE(*mpctxp == NULL); 247224090Sdougb} 248224090Sdougb 249224090Sdougbvoid * 250224090Sdougbisc__mempool_get(isc_mempool_t *mpctx FLARG) { 251224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 252224090Sdougb 253224090Sdougb return (mpctx->methods->get(mpctx FLARG_PASS)); 254224090Sdougb} 255224090Sdougb 256224090Sdougbvoid 257224090Sdougbisc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) { 258224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 259224090Sdougb 260224090Sdougb mpctx->methods->put(mpctx, mem FLARG_PASS); 261224090Sdougb} 262224090Sdougb 263224090Sdougbunsigned int 264224090Sdougbisc_mempool_getallocated(isc_mempool_t *mpctx) { 265224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 266224090Sdougb 267224090Sdougb return (mpctx->methods->getallocated(mpctx)); 268224090Sdougb} 269224090Sdougb 270224090Sdougbvoid 271224090Sdougbisc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) { 272224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 273224090Sdougb 274224090Sdougb mpctx->methods->setmaxalloc(mpctx, limit); 275224090Sdougb} 276224090Sdougb 277224090Sdougbvoid 278224090Sdougbisc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) { 279224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 280224090Sdougb 281224090Sdougb mpctx->methods->setfreemax(mpctx, limit); 282224090Sdougb} 283224090Sdougb 284224090Sdougbvoid 285224090Sdougbisc_mempool_setname(isc_mempool_t *mpctx, const char *name) { 286224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 287224090Sdougb 288224090Sdougb mpctx->methods->setname(mpctx, name); 289224090Sdougb} 290224090Sdougb 291224090Sdougbvoid 292224090Sdougbisc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) { 293224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 294224090Sdougb 295224090Sdougb mpctx->methods->associatelock(mpctx, lock); 296224090Sdougb} 297224090Sdougb 298224090Sdougbvoid 299224090Sdougbisc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) { 300224090Sdougb REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 301224090Sdougb 302224090Sdougb mpctx->methods->setfillcount(mpctx, limit); 303224090Sdougb} 304