📄 mpool.h
字号:
/* * Memory pool defines. * * Copyright 1996 by Gray Watson. * * This file is part of the mpool package. * * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Gray Watson not be used in advertising * or publicity pertaining to distribution of the document or software * without specific, written prior permission. * * Gray Watson makes no representations about the suitability of the * software described herein for any purpose. It is provided "as is" * without express or implied warranty. * * The author may be reached via http://256.com/gray/ * * $Id: mpool.h,v 1.4 2006/05/31 20:26:11 gray Exp $ */#ifndef __MPOOL_H__#define __MPOOL_H__#include <sys/types.h>/* * mpool flags to mpool_alloc or mpool_set_attr *//* * Choose a best fit algorithm not first fit. This takes more CPU * time but will result in a tighter heap. */#define MPOOL_FLAG_BEST_FIT (1<<0)/* * By default the library adds 2 bytes onto all allocations to insert * a magic number that it can look for to determine how large a freed * memory chunk is. This flag indicates that few if any frees are * going to be performed on the pool and to not waste memory on these * bytes. */#define MPOOL_FLAG_NO_FREE (1<<1)/* * This enables very heavy packing at the possible expense of CPU. * This affects a number of parts of the library. * * By default the 1st page of memory is reserved for the main mpool * structure. This flag will cause the rest of the 1st block to be * available for use as user memory. * * By default the library looks through the memory when freed looking * for a magic value. There is an internal max size that it will look * and then it will give up. This flag forces it to look until it * finds it. */#define MPOOL_FLAG_HEAVY_PACKING (1<<2)/* * Use sbrk not mmap to allocate pages. This is not recommended for * normal use. */#define MPOOL_FLAG_USE_SBRK (1<<3)/* * Mpool error codes */#define MPOOL_ERROR_NONE 1 /* no error */#define MPOOL_ERROR_ARG_NULL 2 /* function argument is null */#define MPOOL_ERROR_ARG_INVALID 3 /* function argument is invalid */#define MPOOL_ERROR_PNT 4 /* invalid mpool pointer */#define MPOOL_ERROR_POOL_OVER 5 /* mpool structure was overwritten */#define MPOOL_ERROR_PAGE_SIZE 6 /* could not get system page-size */#define MPOOL_ERROR_OPEN_ZERO 7 /* could not open /dev/zero */#define MPOOL_ERROR_NO_MEM 8 /* no memory available */#define MPOOL_ERROR_MMAP 9 /* problems with mmap */#define MPOOL_ERROR_SIZE 10 /* error processing requested size */#define MPOOL_ERROR_TOO_BIG 11 /* allocation exceeded max size */#define MPOOL_ERROR_MEM 12 /* invalid memory address */#define MPOOL_ERROR_MEM_OVER 13 /* memory lower bounds overwritten */#define MPOOL_ERROR_NOT_FOUND 14 /* memory block not found in pool */#define MPOOL_ERROR_IS_FREE 15 /* memory block already free */#define MPOOL_ERROR_BLOCK_STAT 16 /* invalid internal block status */#define MPOOL_ERROR_FREE_ADDR 17 /* invalid internal free address */#define MPOOL_ERROR_SBRK_CONTIG 18 /* sbrk did not return contiguous mem*/#define MPOOL_ERROR_NO_PAGES 19 /* ran out of pages in pool */#define MPOOL_ERROR_ALLOC 20 /* calloc,malloc,free,realloc failed */#define MPOOL_ERROR_PNT_OVER 21 /* pointer structure was overwritten *//* * Mpool function IDs for the mpool_log_func callback function. */#define MPOOL_FUNC_CLOSE 1 /* mpool_close function called */#define MPOOL_FUNC_CLEAR 2 /* mpool_clear function called */#define MPOOL_FUNC_ALLOC 3 /* mpool_alloc function called */#define MPOOL_FUNC_CALLOC 4 /* mpool_calloc function called */#define MPOOL_FUNC_FREE 5 /* mpool_free function called */#define MPOOL_FUNC_RESIZE 6 /* mpool_resize function called *//* * void mpool_log_func_t * * DESCRIPTION: * * Mpool transaction log function. * * RETURNS: * * None. * * ARGUMENT: * * mp_p -> Associated mpool address. * * func_id -> Integer function ID which identifies which mpool * function is being called. * * byte_size -> Optionally specified byte size. * * ele_n -> Optionally specified element number. For mpool_calloc * only. * * new_addr -> Optionally specified new address. For mpool_alloc, * mpool_calloc, and mpool_resize only. * * old_addr -> Optionally specified old address. For mpool_resize and * mpool_free only. * * old_byte_size -> Optionally specified old byte size. For * mpool_resize only. */typedef void (*mpool_log_func_t)(const void *mp_p, const int func_id, const unsigned long byte_size, const unsigned long ele_n, const void *old_addr, const void *new_addr, const unsigned long old_byte_size);#ifdef MPOOL_MAIN#include "mpool_loc.h"#else/* generic mpool type */typedef void mpool_t;#endif/*<<<<<<<<<< The below prototypes are auto-generated by fillproto *//* * mpool_t *mpool_open * * DESCRIPTION: * * Open/allocate a new memory pool. * * RETURNS: * * Success - Pool pointer which must be passed to mpool_close to * deallocate. * * Failure - NULL * * ARGUMENTS: * * flags -> Flags to set attributes of the memory pool. See the top * of mpool.h. * * page_size -> Set the internal memory page-size. This must be a * multiple of the getpagesize() value. Set to 0 for the default. * * start_addr -> Starting address to try and allocate memory pools. * This is ignored if the MPOOL_FLAG_USE_SBRK is enabled. * * error_p <- Pointer to integer which, if not NULL, will be set with * a mpool error code. */externmpool_t *mpool_open(const unsigned int flags, const unsigned int page_size, void *start_addr, int *error_p);/* * int mpool_close * * DESCRIPTION: * * Close/free a memory allocation pool previously opened with * mpool_open. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p <-> Pointer to our memory pool. */externint mpool_close(mpool_t *mp_p);/* * int mpool_clear * * DESCRIPTION: * * Wipe an opened memory pool clean so we can start again. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p <-> Pointer to our memory pool. */externint mpool_clear(mpool_t *mp_p);/* * void *mpool_alloc * * DESCRIPTION: * * Allocate space for bytes inside of an already open memory pool. * * RETURNS: * * Success - Pointer to the address to use. * * Failure - NULL * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. If NULL then it will do a * normal malloc. * * byte_size -> Number of bytes to allocate in the pool. Must be >0. * * error_p <- Pointer to integer which, if not NULL, will be set with * a mpool error code. */externvoid *mpool_alloc(mpool_t *mp_p, const unsigned long byte_size, int *error_p);/* * void *mpool_calloc * * DESCRIPTION: * * Allocate space for elements of bytes in the memory pool and zero * the space afterwards. * * RETURNS: * * Success - Pointer to the address to use. * * Failure - NULL * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. If NULL then it will do a * normal calloc. * * ele_n -> Number of elements to allocate. * * ele_size -> Number of bytes per element being allocated. * * error_p <- Pointer to integer which, if not NULL, will be set with * a mpool error code. */externvoid *mpool_calloc(mpool_t *mp_p, const unsigned long ele_n, const unsigned long ele_size, int *error_p);/* * int mpool_free * * DESCRIPTION: * * Free an address from a memory pool. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. If NULL then it will do a * normal free. * * addr <-> Address to free. * * size -> Size of the address being freed. */externint mpool_free(mpool_t *mp_p, void *addr, const unsigned long size);/* * void *mpool_resize * * DESCRIPTION: * * Reallocate an address in a mmeory pool to a new size. This is * different from realloc in that it needs the old address' size. If * you don't have it then you need to allocate new space, copy the * data, and free the old pointer yourself. * * RETURNS: * * Success - Pointer to the address to use. * * Failure - NULL * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. If NULL then it will do a * normal realloc. * * old_addr -> Previously allocated address. * * old_byte_size -> Size of the old address. Must be known, cannot be * 0. * * new_byte_size -> New size of the allocation. * * error_p <- Pointer to integer which, if not NULL, will be set with * a mpool error code. */externvoid *mpool_resize(mpool_t *mp_p, void *old_addr, const unsigned long old_byte_size, const unsigned long new_byte_size, int *error_p);/* * int mpool_stats * * DESCRIPTION: * * Return stats from the memory pool. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p -> Pointer to the memory pool. * * page_size_p <- Pointer to an unsigned integer which, if not NULL, * will be set to the page-size of the pool. * * num_alloced_p <- Pointer to an unsigned long which, if not NULL, * will be set to the number of pointers currently allocated in pool. * * user_alloced_p <- Pointer to an unsigned long which, if not NULL, * will be set to the number of user bytes allocated in this pool. * * max_alloced_p <- Pointer to an unsigned long which, if not NULL, * will be set to the maximum number of user bytes that have been * allocated in this pool. * * tot_alloced_p <- Pointer to an unsigned long which, if not NULL, * will be set to the total amount of space (including administrative * overhead) used by the pool. */externint mpool_stats(const mpool_t *mp_p, unsigned int *page_size_p, unsigned long *num_alloced_p, unsigned long *user_alloced_p, unsigned long *max_alloced_p, unsigned long *tot_alloced_p);/* * int mpool_set_log_func * * DESCRIPTION: * * Set a logging callback function to be called whenever there was a * memory transaction. See mpool_log_func_t. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. * * log_func -> Log function (defined in mpool.h) which will be called * with each mpool transaction. */externint mpool_set_log_func(mpool_t *mp_p, mpool_log_func_t log_func);/* * int mpool_set_max_pages * * DESCRIPTION: * * Set the maximum number of pages that the library will use. Once it * hits the limit it will return MPOOL_ERROR_NO_PAGES. * * NOTE: if the MPOOL_FLAG_HEAVY_PACKING is set then this max-pages * value will include the page with the mpool header structure in it. * If the flag is _not_ set then the max-pages will not include this * first page. * * RETURNS: * * Success - MPOOL_ERROR_NONE * * Failure - Mpool error code * * ARGUMENTS: * * mp_p <-> Pointer to the memory pool. * * max_pages -> Maximum number of pages used by the library. */externint mpool_set_max_pages(mpool_t *mp_p, const unsigned int max_pages);/* * const char *mpool_strerror * * DESCRIPTION: * * Return the corresponding string for the error number. * * RETURNS: * * Success - String equivalient of the error. * * Failure - String "invalid error code" * * ARGUMENTS: * * error -> Error number that we are converting. */externconst char *mpool_strerror(const int error);/*<<<<<<<<<< This is end of the auto-generated output from fillproto. */#endif /* ! __MPOOL_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -