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