2 * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
17 /* $Id: mem_api.c,v 1.8 2010/08/12 21:30:26 jinmei Exp $ */
21 #include <isc/magic.h>
26 #if ISC_MEM_TRACKLINES
27 #define FLARG_PASS , file, line
28 #define FLARG , const char *file, unsigned int line
34 static isc_mutex_t createlock;
35 static isc_once_t once = ISC_ONCE_INIT;
36 static isc_memcreatefunc_t mem_createfunc = NULL;
40 RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
44 isc_mem_register(isc_memcreatefunc_t createfunc) {
45 isc_result_t result = ISC_R_SUCCESS;
47 RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
50 if (mem_createfunc == NULL)
51 mem_createfunc = createfunc;
53 result = ISC_R_EXISTS;
60 isc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) {
65 REQUIRE(mem_createfunc != NULL);
66 result = (*mem_createfunc)(init_max_size, target_size, mctxp,
75 isc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp,
82 REQUIRE(mem_createfunc != NULL);
83 result = (*mem_createfunc)(init_max_size, target_size, mctxp, flags);
91 isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
92 REQUIRE(ISCAPI_MCTX_VALID(source));
93 REQUIRE(targetp != NULL && *targetp == NULL);
95 source->methods->attach(source, targetp);
97 ENSURE(*targetp == source);
101 isc_mem_detach(isc_mem_t **mctxp) {
102 REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
104 (*mctxp)->methods->detach(mctxp);
106 ENSURE(*mctxp == NULL);
110 isc_mem_destroy(isc_mem_t **mctxp) {
111 REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
113 (*mctxp)->methods->destroy(mctxp);
115 ENSURE(*mctxp == NULL);
119 isc__mem_get(isc_mem_t *mctx, size_t size FLARG) {
120 REQUIRE(ISCAPI_MCTX_VALID(mctx));
122 return (mctx->methods->memget(mctx, size FLARG_PASS));
126 isc__mem_put(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
127 REQUIRE(ISCAPI_MCTX_VALID(mctx));
129 mctx->methods->memput(mctx, ptr, size FLARG_PASS);
133 isc__mem_putanddetach(isc_mem_t **mctxp, void *ptr, size_t size FLARG) {
134 REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
136 (*mctxp)->methods->memputanddetach(mctxp, ptr, size FLARG_PASS);
139 * XXX: We cannot always ensure *mctxp == NULL here
140 * (see lib/isc/mem.c).
145 isc__mem_allocate(isc_mem_t *mctx, size_t size FLARG) {
146 REQUIRE(ISCAPI_MCTX_VALID(mctx));
148 return (mctx->methods->memallocate(mctx, size FLARG_PASS));
152 isc__mem_reallocate(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
153 REQUIRE(ISCAPI_MCTX_VALID(mctx));
155 return (mctx->methods->memreallocate(mctx, ptr, size FLARG_PASS));
159 isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
160 REQUIRE(ISCAPI_MCTX_VALID(mctx));
162 return (mctx->methods->memstrdup(mctx, s FLARG_PASS));
166 isc__mem_free(isc_mem_t *mctx, void *ptr FLARG) {
167 REQUIRE(ISCAPI_MCTX_VALID(mctx));
169 mctx->methods->memfree(mctx, ptr FLARG_PASS);
173 isc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t flag) {
174 REQUIRE(ISCAPI_MCTX_VALID(mctx));
176 mctx->methods->setdestroycheck(mctx, flag);
180 isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
181 size_t hiwater, size_t lowater)
183 REQUIRE(ISCAPI_MCTX_VALID(ctx));
185 ctx->methods->setwater(ctx, water, water_arg, hiwater, lowater);
189 isc_mem_waterack(isc_mem_t *ctx, int flag) {
190 REQUIRE(ISCAPI_MCTX_VALID(ctx));
192 ctx->methods->waterack(ctx, flag);
196 isc_mem_inuse(isc_mem_t *mctx) {
197 REQUIRE(ISCAPI_MCTX_VALID(mctx));
199 return (mctx->methods->inuse(mctx));
203 isc_mem_isovermem(isc_mem_t *mctx) {
204 REQUIRE(ISCAPI_MCTX_VALID(mctx));
206 return (mctx->methods->isovermem(mctx));
210 isc_mem_setname(isc_mem_t *mctx, const char *name, void *tag) {
211 REQUIRE(ISCAPI_MCTX_VALID(mctx));
220 isc_mem_getname(isc_mem_t *mctx) {
221 REQUIRE(ISCAPI_MCTX_VALID(mctx));
227 isc_mem_gettag(isc_mem_t *mctx) {
228 REQUIRE(ISCAPI_MCTX_VALID(mctx));
234 isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
235 REQUIRE(ISCAPI_MCTX_VALID(mctx));
237 return (mctx->methods->mpcreate(mctx, size, mpctxp));
241 isc_mempool_destroy(isc_mempool_t **mpctxp) {
242 REQUIRE(mpctxp != NULL && ISCAPI_MPOOL_VALID(*mpctxp));
244 (*mpctxp)->methods->destroy(mpctxp);
246 ENSURE(*mpctxp == NULL);
250 isc__mempool_get(isc_mempool_t *mpctx FLARG) {
251 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
253 return (mpctx->methods->get(mpctx FLARG_PASS));
257 isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
258 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
260 mpctx->methods->put(mpctx, mem FLARG_PASS);
264 isc_mempool_getallocated(isc_mempool_t *mpctx) {
265 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
267 return (mpctx->methods->getallocated(mpctx));
271 isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
272 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
274 mpctx->methods->setmaxalloc(mpctx, limit);
278 isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
279 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
281 mpctx->methods->setfreemax(mpctx, limit);
285 isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
286 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
288 mpctx->methods->setname(mpctx, name);
292 isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
293 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
295 mpctx->methods->associatelock(mpctx, lock);
299 isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
300 REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
302 mpctx->methods->setfillcount(mpctx, limit);