mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-14 08:11:51 +00:00
117 lines
4.3 KiB
C
117 lines
4.3 KiB
C
/*
|
|
* Memory pool local 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_loc.h,v 1.2 2005/05/20 20:08:54 gray Exp $
|
|
*/
|
|
|
|
#ifndef __MPOOL_LOC_H__
|
|
#define __MPOOL_LOC_H__
|
|
|
|
#define MPOOL_MAGIC 0xABACABA /* magic for struct */
|
|
#define BLOCK_MAGIC 0xB1B1007 /* magic for blocks */
|
|
#define FENCE_MAGIC0 (unsigned char)(0xFAU) /* 1st magic mem byte */
|
|
#define FENCE_MAGIC1 (unsigned char)(0xD3U) /* 2nd magic mem byte */
|
|
|
|
#define FENCE_SIZE 2 /* fence space */
|
|
#define MIN_ALLOCATION (sizeof(mpool_free_t)) /* min alloc */
|
|
#define MAX_FREE_SEARCH 10240 /* max size to search */
|
|
#define MAX_FREE_LIST_SEARCH 100 /* max looking for free mem */
|
|
|
|
/*
|
|
* bitflag tools for Variable and a Flag
|
|
*/
|
|
#define BIT_FLAG(x) (1 << (x))
|
|
#define BIT_SET(v,f) (v) |= (f)
|
|
#define BIT_CLEAR(v,f) (v) &= ~(f)
|
|
#define BIT_IS_SET(v,f) ((v) & (f))
|
|
#define BIT_TOGGLE(v,f) (v) ^= (f)
|
|
|
|
#define SET_POINTER(pnt, val) \
|
|
do { \
|
|
if ((pnt) != NULL) { \
|
|
(*(pnt)) = (val); \
|
|
} \
|
|
} while(0)
|
|
|
|
#define BLOCK_FLAG_USED BIT_FLAG(0) /* block is used */
|
|
#define BLOCK_FLAG_FREE BIT_FLAG(1) /* block is free */
|
|
|
|
#define DEFAULT_PAGE_MULT 16 /* pagesize = this * getpagesize*/
|
|
|
|
/* How many pages SIZE bytes resides in. We add in the block header. */
|
|
#define PAGES_IN_SIZE(mp_p, size) (((size) + sizeof(mpool_block_t) + \
|
|
(mp_p)->mp_page_size - 1) / \
|
|
(mp_p)->mp_page_size)
|
|
#define SIZE_OF_PAGES(mp_p, page_n) ((page_n) * (mp_p)->mp_page_size)
|
|
#define MAX_BITS 30 /* we only can allocate 1gb chunks */
|
|
|
|
#define MAX_BLOCK_USER_MEMORY(mp_p) ((mp_p)->mp_page_size - \
|
|
sizeof(mpool_block_t))
|
|
#define FIRST_ADDR_IN_BLOCK(block_p) (void *)((char *)(block_p) + \
|
|
sizeof(mpool_block_t))
|
|
#define MEMORY_IN_BLOCK(block_p) ((char *)(block_p)->mb_bounds_p - \
|
|
((char *)(block_p) + \
|
|
sizeof(mpool_block_t)))
|
|
|
|
typedef struct {
|
|
unsigned int mp_magic; /* magic number for struct */
|
|
unsigned int mp_flags; /* flags for the struct */
|
|
unsigned long mp_alloc_c; /* number of allocations */
|
|
unsigned long mp_user_alloc; /* user bytes allocated */
|
|
unsigned long mp_max_alloc; /* maximum user bytes allocated */
|
|
unsigned int mp_page_c; /* number of pages allocated */
|
|
unsigned int mp_max_pages; /* maximum number of pages to use */
|
|
unsigned int mp_page_size; /* page-size of our system */
|
|
int mp_fd; /* fd for /dev/zero if mmap-ing */
|
|
off_t mp_top; /* top of our allocations in fd */
|
|
mpool_log_func_t mp_log_func; /* log callback function */
|
|
void *mp_addr; /* current address for mmaping */
|
|
void *mp_min_p; /* min address in pool for checks */
|
|
void *mp_bounds_p; /* max address in pool for checks */
|
|
struct mpool_block_st *mp_first_p; /* first memory block we are using */
|
|
struct mpool_block_st *mp_last_p; /* last memory block we are using */
|
|
struct mpool_block_st *mp_free[MAX_BITS + 1]; /* free lists based on size */
|
|
unsigned int mp_magic2; /* upper magic for overwrite sanity */
|
|
} mpool_t;
|
|
|
|
/* for debuggers to be able to interrogate the generic type in the .h file */
|
|
typedef mpool_t mpool_ext_t;
|
|
|
|
/*
|
|
* Block header structure. This structure *MUST* be long-word
|
|
* aligned.
|
|
*/
|
|
typedef struct mpool_block_st {
|
|
unsigned int mb_magic; /* magic number for block header */
|
|
void *mb_bounds_p; /* block boundary location */
|
|
struct mpool_block_st *mb_next_p; /* linked list next pointer */
|
|
unsigned int mb_magic2; /* upper magic for overwrite sanity */
|
|
} mpool_block_t;
|
|
|
|
/*
|
|
* Free list structure.
|
|
*/
|
|
typedef struct {
|
|
void *mf_next_p; /* pointer to the next free address */
|
|
unsigned long mf_size; /* size of the free block */
|
|
} mpool_free_t;
|
|
|
|
#endif /* ! __MPOOL_LOC_H__ */
|