1275970Scy/* 2275970Scy * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") 3275970Scy * 4275970Scy * Permission to use, copy, modify, and/or distribute this software for any 5275970Scy * purpose with or without fee is hereby granted, provided that the above 6275970Scy * copyright notice and this permission notice appear in all copies. 7275970Scy * 8275970Scy * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9275970Scy * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10275970Scy * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11275970Scy * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12275970Scy * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13275970Scy * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14275970Scy * PERFORMANCE OF THIS SOFTWARE. 15275970Scy */ 16275970Scy 17275970Scy/* $Id: mem_api.c,v 1.8 2010/08/12 21:30:26 jinmei Exp $ */ 18275970Scy 19275970Scy#include <config.h> 20275970Scy 21275970Scy#include <isc/magic.h> 22275970Scy#include <isc/mem.h> 23275970Scy#include <isc/once.h> 24275970Scy#include <isc/util.h> 25275970Scy 26275970Scy#if ISC_MEM_TRACKLINES 27275970Scy#define FLARG_PASS , file, line 28275970Scy#define FLARG , const char *file, unsigned int line 29275970Scy#else 30275970Scy#define FLARG_PASS 31275970Scy#define FLARG 32275970Scy#endif 33275970Scy 34275970Scystatic isc_mutex_t createlock; 35275970Scystatic isc_once_t once = ISC_ONCE_INIT; 36275970Scystatic isc_memcreatefunc_t mem_createfunc = NULL; 37275970Scy 38275970Scystatic void 39275970Scyinitialize(void) { 40275970Scy RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS); 41275970Scy} 42275970Scy 43275970Scyisc_result_t 44275970Scyisc_mem_register(isc_memcreatefunc_t createfunc) { 45275970Scy isc_result_t result = ISC_R_SUCCESS; 46275970Scy 47275970Scy RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS); 48275970Scy 49275970Scy LOCK(&createlock); 50275970Scy if (mem_createfunc == NULL) 51275970Scy mem_createfunc = createfunc; 52275970Scy else 53275970Scy result = ISC_R_EXISTS; 54275970Scy UNLOCK(&createlock); 55275970Scy 56275970Scy return (result); 57275970Scy} 58275970Scy 59275970Scyisc_result_t 60275970Scyisc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) { 61275970Scy isc_result_t result; 62275970Scy 63275970Scy LOCK(&createlock); 64275970Scy 65275970Scy REQUIRE(mem_createfunc != NULL); 66275970Scy result = (*mem_createfunc)(init_max_size, target_size, mctxp, 67275970Scy ISC_MEMFLAG_DEFAULT); 68275970Scy 69275970Scy UNLOCK(&createlock); 70275970Scy 71275970Scy return (result); 72275970Scy} 73275970Scy 74275970Scyisc_result_t 75275970Scyisc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp, 76275970Scy unsigned int flags) 77275970Scy{ 78275970Scy isc_result_t result; 79275970Scy 80275970Scy LOCK(&createlock); 81275970Scy 82275970Scy REQUIRE(mem_createfunc != NULL); 83275970Scy result = (*mem_createfunc)(init_max_size, target_size, mctxp, flags); 84275970Scy 85275970Scy UNLOCK(&createlock); 86275970Scy 87275970Scy return (result); 88275970Scy} 89275970Scy 90275970Scyvoid 91275970Scyisc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) { 92275970Scy REQUIRE(ISCAPI_MCTX_VALID(source)); 93275970Scy REQUIRE(targetp != NULL && *targetp == NULL); 94275970Scy 95275970Scy source->methods->attach(source, targetp); 96275970Scy 97275970Scy ENSURE(*targetp == source); 98275970Scy} 99275970Scy 100275970Scyvoid 101275970Scyisc_mem_detach(isc_mem_t **mctxp) { 102275970Scy REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 103275970Scy 104275970Scy (*mctxp)->methods->detach(mctxp); 105275970Scy 106275970Scy ENSURE(*mctxp == NULL); 107275970Scy} 108275970Scy 109275970Scyvoid 110275970Scyisc_mem_destroy(isc_mem_t **mctxp) { 111275970Scy REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 112275970Scy 113275970Scy (*mctxp)->methods->destroy(mctxp); 114275970Scy 115275970Scy ENSURE(*mctxp == NULL); 116275970Scy} 117275970Scy 118275970Scyvoid * 119275970Scyisc__mem_get(isc_mem_t *mctx, size_t size FLARG) { 120275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 121275970Scy 122275970Scy return (mctx->methods->memget(mctx, size FLARG_PASS)); 123275970Scy} 124275970Scy 125275970Scyvoid 126275970Scyisc__mem_put(isc_mem_t *mctx, void *ptr, size_t size FLARG) { 127275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 128275970Scy 129275970Scy mctx->methods->memput(mctx, ptr, size FLARG_PASS); 130275970Scy} 131275970Scy 132275970Scyvoid 133275970Scyisc__mem_putanddetach(isc_mem_t **mctxp, void *ptr, size_t size FLARG) { 134275970Scy REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp)); 135275970Scy 136275970Scy (*mctxp)->methods->memputanddetach(mctxp, ptr, size FLARG_PASS); 137275970Scy 138275970Scy /* 139275970Scy * XXX: We cannot always ensure *mctxp == NULL here 140275970Scy * (see lib/isc/mem.c). 141275970Scy */ 142275970Scy} 143275970Scy 144275970Scyvoid * 145275970Scyisc__mem_allocate(isc_mem_t *mctx, size_t size FLARG) { 146275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 147275970Scy 148275970Scy return (mctx->methods->memallocate(mctx, size FLARG_PASS)); 149275970Scy} 150275970Scy 151275970Scyvoid * 152275970Scyisc__mem_reallocate(isc_mem_t *mctx, void *ptr, size_t size FLARG) { 153275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 154275970Scy 155275970Scy return (mctx->methods->memreallocate(mctx, ptr, size FLARG_PASS)); 156275970Scy} 157275970Scy 158275970Scychar * 159275970Scyisc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) { 160275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 161275970Scy 162275970Scy return (mctx->methods->memstrdup(mctx, s FLARG_PASS)); 163275970Scy} 164275970Scy 165275970Scyvoid 166275970Scyisc__mem_free(isc_mem_t *mctx, void *ptr FLARG) { 167275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 168275970Scy 169275970Scy mctx->methods->memfree(mctx, ptr FLARG_PASS); 170275970Scy} 171275970Scy 172275970Scyvoid 173275970Scyisc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t flag) { 174275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 175275970Scy 176275970Scy mctx->methods->setdestroycheck(mctx, flag); 177275970Scy} 178275970Scy 179275970Scyvoid 180275970Scyisc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg, 181275970Scy size_t hiwater, size_t lowater) 182275970Scy{ 183275970Scy REQUIRE(ISCAPI_MCTX_VALID(ctx)); 184275970Scy 185275970Scy ctx->methods->setwater(ctx, water, water_arg, hiwater, lowater); 186275970Scy} 187275970Scy 188275970Scyvoid 189275970Scyisc_mem_waterack(isc_mem_t *ctx, int flag) { 190275970Scy REQUIRE(ISCAPI_MCTX_VALID(ctx)); 191275970Scy 192275970Scy ctx->methods->waterack(ctx, flag); 193275970Scy} 194275970Scy 195275970Scysize_t 196275970Scyisc_mem_inuse(isc_mem_t *mctx) { 197275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 198275970Scy 199275970Scy return (mctx->methods->inuse(mctx)); 200275970Scy} 201275970Scy 202275970Scyisc_boolean_t 203275970Scyisc_mem_isovermem(isc_mem_t *mctx) { 204275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 205275970Scy 206275970Scy return (mctx->methods->isovermem(mctx)); 207275970Scy} 208275970Scy 209275970Scyvoid 210275970Scyisc_mem_setname(isc_mem_t *mctx, const char *name, void *tag) { 211275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 212275970Scy 213275970Scy UNUSED(name); 214275970Scy UNUSED(tag); 215275970Scy 216275970Scy return; 217275970Scy} 218275970Scy 219275970Scyconst char * 220275970Scyisc_mem_getname(isc_mem_t *mctx) { 221275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 222275970Scy 223275970Scy return (""); 224275970Scy} 225275970Scy 226275970Scyvoid * 227275970Scyisc_mem_gettag(isc_mem_t *mctx) { 228275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 229275970Scy 230275970Scy return (NULL); 231275970Scy} 232275970Scy 233275970Scyisc_result_t 234275970Scyisc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) { 235275970Scy REQUIRE(ISCAPI_MCTX_VALID(mctx)); 236275970Scy 237275970Scy return (mctx->methods->mpcreate(mctx, size, mpctxp)); 238275970Scy} 239275970Scy 240275970Scyvoid 241275970Scyisc_mempool_destroy(isc_mempool_t **mpctxp) { 242275970Scy REQUIRE(mpctxp != NULL && ISCAPI_MPOOL_VALID(*mpctxp)); 243275970Scy 244275970Scy (*mpctxp)->methods->destroy(mpctxp); 245275970Scy 246275970Scy ENSURE(*mpctxp == NULL); 247275970Scy} 248275970Scy 249275970Scyvoid * 250275970Scyisc__mempool_get(isc_mempool_t *mpctx FLARG) { 251275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 252275970Scy 253275970Scy return (mpctx->methods->get(mpctx FLARG_PASS)); 254275970Scy} 255275970Scy 256275970Scyvoid 257275970Scyisc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) { 258275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 259275970Scy 260275970Scy mpctx->methods->put(mpctx, mem FLARG_PASS); 261275970Scy} 262275970Scy 263275970Scyunsigned int 264275970Scyisc_mempool_getallocated(isc_mempool_t *mpctx) { 265275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 266275970Scy 267275970Scy return (mpctx->methods->getallocated(mpctx)); 268275970Scy} 269275970Scy 270275970Scyvoid 271275970Scyisc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) { 272275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 273275970Scy 274275970Scy mpctx->methods->setmaxalloc(mpctx, limit); 275275970Scy} 276275970Scy 277275970Scyvoid 278275970Scyisc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) { 279275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 280275970Scy 281275970Scy mpctx->methods->setfreemax(mpctx, limit); 282275970Scy} 283275970Scy 284275970Scyvoid 285275970Scyisc_mempool_setname(isc_mempool_t *mpctx, const char *name) { 286275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 287275970Scy 288275970Scy mpctx->methods->setname(mpctx, name); 289275970Scy} 290275970Scy 291275970Scyvoid 292275970Scyisc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) { 293275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 294275970Scy 295275970Scy mpctx->methods->associatelock(mpctx, lock); 296275970Scy} 297275970Scy 298275970Scyvoid 299275970Scyisc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) { 300275970Scy REQUIRE(ISCAPI_MPOOL_VALID(mpctx)); 301275970Scy 302275970Scy mpctx->methods->setfillcount(mpctx, limit); 303275970Scy} 304