Source to ./mempool.h
/*
* Copyright (c) 1999-2006 Christophe Fillot.
* E-mail: [email protected]
*
* mempool.h: Simple Memory Pools.
*/
#ifndef __MEMPOOL_H__
#define __MEMPOOL_H__ 1
#include <sys/types.h>
#include <sys/time.h>
#include <pthread.h>
#include "utils.h"
/* Memory Pool "Fixed" Flag */
#define MEMPOOL_FIXED 1
/* Dummy value used to check if a memory block is invalid */
#define MEMBLOCK_TAG 0xdeadbeef
typedef struct memblock memblock_t;
typedef struct mempool mempool_t;
/* Memory block */
struct memblock {
int tag; /* MEMBLOCK_TAG if block is valid */
size_t block_size; /* Block size (without header) */
memblock_t *next,*prev; /* Double linked list pointers */
mempool_t *pool; /* Pool which contains this block */
m_uint64_t data[0]; /* Memory block itself */
};
/* Memory Pool */
struct mempool {
memblock_t *block_list; /* Double-linked block list */
pthread_mutex_t lock; /* Mutex for managing pool */
char *name; /* Name of this pool */
int flags; /* Flags */
int nr_blocks; /* Number of blocks in this pool */
size_t total_size; /* Total bytes allocated */
size_t max_size; /* Maximum memory */
};
/* Lock and unlock access to a memory pool */
#define MEMPOOL_LOCK(mp) pthread_mutex_lock(&(mp)->lock)
#define MEMPOOL_UNLOCK(mp) pthread_mutex_unlock(&(mp)->lock)
/* Callback function for use with mp_foreach */
typedef void (*mp_foreach_cbk)(memblock_t *block,void *user_arg);
/* Execute an action for each block in specified pool */
static inline void mp_foreach(mempool_t *pool,mp_foreach_cbk cbk,void *arg)
{
memblock_t *mb;
for(mb=pool->block_list;mb;mb=mb->next)
cbk(mb,arg);
}
/* Allocate a new block in specified pool */
void *mp_alloc(mempool_t *pool,size_t size);
/* Allocate a new block which will not be zeroed */
void *mp_alloc_n0(mempool_t *pool,size_t size);
/* Reallocate a block */
void *mp_realloc(void *addr,size_t new_size);
/* Allocate a new memory block and copy data into it */
void *mp_dup(mempool_t *pool,void *data,size_t size);
/* Duplicate specified string and insert it in a memory pool */
char *mp_strdup(mempool_t *pool,char *str);
/* Free block at specified address */
int mp_free(void *addr);
/* Free block at specified address and clean pointer */
int mp_free_ptr(void *addr);
/* Free all blocks of specified pool */
void mp_free_all_blocks(mempool_t *pool);
/* Free specified memory pool */
void mp_free_pool(mempool_t *pool);
/* Create a new pool in a fixed memory area */
mempool_t *mp_create_fixed_pool(mempool_t *mp,char *name);
/* Create a new pool */
mempool_t *mp_create_pool(char *name);
#endif