mem.h revision 669940866360b2e50eed04f18f58ca7fe302c8ba
9bff67898d55cddfcec9ce30cc2b1bb6211ec691David Lawrence/*
9bff67898d55cddfcec9ce30cc2b1bb6211ec691David Lawrence * Copyright (C) 1997, 1998, 1999, 2000 Internet Software Consortium.
9bff67898d55cddfcec9ce30cc2b1bb6211ec691David Lawrence *
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence * Permission to use, copy, modify, and distribute this software for any
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence * purpose with or without fee is hereby granted, provided that the above
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * copyright notice and this permission notice appear in all copies.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff *
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * SOFTWARE.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#ifndef ISC_MEM_H
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define ISC_MEM_H 1
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#include <stdio.h>
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#include <isc/lang.h>
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#include <isc/mutex.h>
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#include <isc/types.h>
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael GraffISC_LANG_BEGINDECLS
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Grafftypedef void * (*isc_memalloc_t)(void *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Grafftypedef void (*isc_memfree_t)(void *, void *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#ifdef ISC_MEM_DEBUG
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_get(c, s) isc__mem_getdebug(c, s, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_put(c, p, s) isc__mem_putdebug(c, p, s, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_allocate(c, s) isc__mem_allocatedebug(c, s, \
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_free(c, p) isc__mem_freedebug(c, p, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_strdup(c, p) isc__mem_strdupdebug(c, p, \
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mempool_get(c) isc__mempool_getdebug(c, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mempool_put(c, p) isc__mempool_putdebug(c, p, \
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#else
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_get isc__mem_get
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_put isc__mem_put
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_allocate isc__mem_allocate
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_free isc__mem_free
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mem_strdup isc__mem_strdup
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mempool_get isc__mempool_get
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define isc_mempool_put isc__mempool_put
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#endif /* ISC_MEM_DEBUG */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t isc_mem_create(size_t, size_t, isc_mem_t **);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_attach(isc_mem_t *, isc_mem_t **);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_detach(isc_mem_t **);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_destroy(isc_mem_t **);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t isc_mem_ondestroy(isc_mem_t *ctx,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff isc_task_t *task,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff isc_event_t **event);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mem_get(isc_mem_t *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mem_put(isc_mem_t *, void *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mem_getdebug(isc_mem_t *, size_t,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mem_putdebug(isc_mem_t *, void *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff size_t, const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t isc_mem_preallocate(isc_mem_t *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_stats(isc_mem_t *, FILE *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_boolean_t isc_mem_valid(isc_mem_t *, void *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mem_allocate(isc_mem_t *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mem_allocatedebug(isc_mem_t *, size_t,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mem_free(isc_mem_t *, void *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mem_freedebug(isc_mem_t *, void *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffchar * isc__mem_strdup(isc_mem_t *, const char *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffchar * isc__mem_strdupdebug(isc_mem_t *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_setdestroycheck(isc_mem_t *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff isc_boolean_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_setsplit(isc_mem_t *, isc_boolean_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc_mem_setquota(isc_mem_t *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffsize_t isc_mem_getquota(isc_mem_t *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffsize_t isc_mem_inuse(isc_mem_t *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t isc_mem_createx(size_t, size_t,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff isc_memalloc_t memalloc,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff isc_memfree_t memfree,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff void *arg, isc_mem_t **);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t isc_mem_restore(isc_mem_t *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#ifdef ISC_MEMCLUSTER_LEGACY
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff/*
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * Legacy.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define meminit __meminit
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define mem_default_context __mem_default_context
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#ifdef MEMCLUSTER_DEBUG
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memget(s) __memget_debug(s, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memput(p, s) __memput_debug(p, s, __FILE__, __LINE__)
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#else
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memget __memget
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memput __memput
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#endif
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memvalid __memvalid
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#define memstats __memstats
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffint meminit(size_t, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_mem_t * mem_default_context(void);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * __memget(size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid __memput(void *, size_t);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * __memget_debug(size_t, const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid __memput_debug(void *, size_t, const char *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffint memvalid(void *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid memstats(FILE *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff#endif /* ISC_MEMCLUSTER_LEGACY */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff/*
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * Memory pools
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff/*
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * Internal (but public) functions. Don't call these from application
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * code. Use isc_mempool_get() and isc_mempool_put() instead.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff */
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mempool_get(isc_mempool_t *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mempool_put(isc_mempool_t *, void *);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid * isc__mempool_getdebug(isc_mempool_t *, const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffvoid isc__mempool_putdebug(isc_mempool_t *, void *,
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff const char *, int);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_result_t
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graffisc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp);
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff/*
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * Create a memory pool.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff *
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * Requires:
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * mctx is a valid memory context.
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * size > 0
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff * mpctxp != NULL and *mpctxp == NULL
b75dc2a3d82c0ad078b5155057e66e5b694faeb7Michael Graff *
* Defaults:
* maxalloc = UINT_MAX
* freemax = 1
* fillcount = 1
*
* Returns:
* ISC_R_NOMEMORY -- not enough memory to create pool
* ISC_R_SUCCESS -- all is well.
*/
void
isc_mempool_destroy(isc_mempool_t **mpctxp);
/*
* Destroy a memory pool.
*
* Requires:
* mpctxp != NULL && *mpctxp is a valid pool.
* The pool has no un"put" allocations outstanding
*/
void
isc_mempool_setname(isc_mempool_t *mpctx, char *name);
/*
* Associate a name with a memory pool. At most 15 characters may be used.
*
* Requires:
* mpctx is a valid pool.
* name != NULL;
*/
void
isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
/*
* Associate a lock with this memory pool.
*
* This lock is used when getting or putting items using this memory pool,
* and it is also used to set or get internal state via the isc_mempool_get*()
* and isc_mempool_set*() set of functions.
*
* Mutiple pools can each share a single lock. For instance, if "manager"
* type object contained pools for various sizes of events, and each of
* these pools used a common lock. Note that this lock must NEVER be used
* by other than mempool routines once it is given to a pool, since that can
* easily cause double locking.
*
* Requires:
*
* mpctpx is a valid pool.
*
* lock != NULL.
*
* No previous lock is assigned to this pool.
*
* The lock is initialized before calling this function via the normal
* means of doing that.
*/
/*
* The following functions get/set various parameters. Note that due to
* the unlocked nature of pools these are potentially random values unless
* the imposed externally provided locking protocols are followed.
*
* Also note that the quota limits will not always take immediate effect.
* For instance, setting "maxalloc" to a number smaller than the currently
* allocated count is permitted. New allocations will be refused until
* the count drops below this threshold.
*
* All functions require (in addition to other requirements):
* mpctx is a valid memory pool
*/
unsigned int
isc_mempool_getfreemax(isc_mempool_t *mpctx);
/*
* Returns the maximum allowed size of the free list.
*/
void
isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit);
/*
* Sets the maximum allowed size of the free list.
*/
unsigned int
isc_mempool_getfreecount(isc_mempool_t *mpctx);
/*
* Returns current size of the free list.
*/
unsigned int
isc_mempool_getmaxalloc(isc_mempool_t *mpctx);
/*
* Returns the maximum allowed number of allocations.
*/
void
isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit);
/*
* Sets the maximum allowed number of allocations.
*
* Additional requirements:
* limit > 0
*/
unsigned int
isc_mempool_getallocated(isc_mempool_t *mpctx);
/*
* Returns the number of items allocated from this pool.
*/
unsigned int
isc_mempool_getfillcount(isc_mempool_t *mpctx);
/*
* Returns the number of items allocated as a block from the parent memory
* context when the free list is empty.
*/
void
isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
/*
* Sets the fillcount.
*
* Additional requirements:
* limit > 0
*/
ISC_LANG_ENDDECLS
#endif /* MEM_H */