--- libaitsess/inc/aitsess.h 2012/02/10 23:04:41 1.3.2.7 +++ libaitsess/inc/aitsess.h 2012/02/27 21:18:31 1.4.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsess.h,v 1.3.2.7 2012/02/10 23:04:41 misho Exp $ +* $Id: aitsess.h,v 1.4.2.2 2012/02/27 21:18:31 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,9 +47,9 @@ SUCH DAMAGE. #define __AITSESS_H +#include #include #include -#include #include #define SHARED_UNKNOWN -1 @@ -66,7 +66,48 @@ SUCH DAMAGE. #define MAX_ATTRIBUTE 64 #define MAX_SEMNAME 14 +/* Memory pool */ +#define MEM_BUCKETS 28 /* 32 bits - 4 bits = 28 items in bucket array */ + +struct tagAlloc { + char alloc_name[MAX_ATTRIBUTE]; + volatile unsigned int alloc_flags; + + unsigned int *alloc_mem; + + TAILQ_ENTRY(tagAlloc) alloc_node; +}; +typedef TAILQ_HEAD(, tagAlloc) mpool_bucket_t; + +typedef struct _tagMPool { + pthread_mutex_t pool_mtx; + + struct { + unsigned long alloc; + unsigned long free; + unsigned long cache; + } pool_calls; + struct { + unsigned long alloc; + unsigned long free; + unsigned long cache; + } pool_bytes; + struct { + unsigned long max; + unsigned long curr; + unsigned long inact; + } pool_quota; + + /* pool buckets */ + mpool_bucket_t pool_active[MEM_BUCKETS]; + mpool_bucket_t pool_inactive[MEM_BUCKETS]; +} mpool_t; +#define mpool_lock(x) (assert((x)), pthread_mutex_lock(&(x)->pool_mtx)) +#define mpool_unlock(x) (assert((x)), pthread_mutex_unlock(&(x)->pool_mtx)) + +/* Shared memory session */ + typedef struct tagSess { key_t key; char type; @@ -109,6 +150,58 @@ inline void sess_SetErr(int eno, char *estr, ...); /* + * mpool_init() - Init memory pool + * + * return: =NULL error or !=NULL new allocated pool + */ +mpool_t *mpool_init(void); +/* + * mpool_destroy() - Destroy memory pool + * + * @mp = Memory pool + * return: none + */ +void mpool_destroy(mpool_t ** __restrict mp); +/* + * mpool_malloc() - Memory allocation + * + * @mp = Memory pool + * @size = Size + * @memname = Optional memory block name + * return: NULL error or !=NULL ok allocated memory + */ +void *mpool_malloc(mpool_t * __restrict mp, unsigned int size, const char *memname); +/* + * mpool_free() Free allocated memory with mpool_alloc() + * + * @mp = Memory pool + * @data = Allocated memory data + * @purge = if !=0 force release memory block + * return: <0 error or 0 ok released memory block + */ +int mpool_free(mpool_t * __restrict mp, void * __restrict data, int purge); +/* + * mpool_free2() Free allocated memory with mpool_alloc() by size and memory name + * + * @mp = Memory pool + * @size = Allocated memory data size + * @memname = Memory name + * @purge = if !=0 force release memory block + * return: <0 error or 0 ok released memory block + */ +int mpool_free2(mpool_t * __restrict mp, unsigned int size, const char *memname, int purge); +/* + * mpool_getmembynam() Find allocated memory block by size and memory name + * + * @mp = Memory pool + * @size = Memory size + * @memname = Memory name + * return: NULL error or not found and !=NULL allocated memory + */ +inline struct tagAlloc *mpool_getmembynam(mpool_t * __restrict mp, unsigned int size, const char *memname); + + +/* * sess_initSession() Initializing session structure, if session file not exists creating with specified tech * * @id = Technology using in session. SHARED_IPC IPC tech orSHARED_MAP BSD MemoryMap tech @@ -121,10 +214,9 @@ int sess_initSession(int id, const char *csFName, ait_ * sess_freeSession() Free allocated memory for session item and delete session file if present name * * @Sess = Session item - * @delFile = !=0 delete session file or =0 keep session * return: none */ -void sess_freeSession(ait_sess_t ** __restrict Sess, int delFile); +void sess_freeSession(ait_sess_t ** __restrict Sess); /*