--- libaitsess/inc/aitsess.h 2012/02/10 16:45:36 1.3.2.3 +++ libaitsess/inc/aitsess.h 2012/02/28 00:13:26 1.4.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsess.h,v 1.3.2.3 2012/02/10 16:45:36 misho Exp $ +* $Id: aitsess.h,v 1.4.2.4 2012/02/28 00:13:26 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -47,9 +47,9 @@ SUCH DAMAGE. #define __AITSESS_H +#include #include #include -#include #include #define SHARED_UNKNOWN -1 @@ -66,14 +66,53 @@ SUCH DAMAGE. #define MAX_ATTRIBUTE 64 #define MAX_SEMNAME 14 +/* Memory pool */ -struct tagSess; -typedef struct tagSess ait_sess_t; +#define MEM_BUCKETS 28 /* 32 bits - 4 bits = 28 items in bucket array */ -struct tagSess { +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; + } 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; char zcpy; + + char name[BUFSIZ]; off_t eom; void *addr; off_t offset; @@ -87,16 +126,16 @@ struct tagSess { } id; struct { - int (*create)(const char *, int, long, ait_sess_t * __restrict, ...); - void (*destroy)(const char*, ait_sess_t * __restrict); - void *(*attach)(ait_sess_t * __restrict, void *); - void (*detach)(ait_sess_t * __restrict); - void (*notSem)(ait_sess_t * __restrict); - int (*isSemOK)(ait_sess_t * __restrict); - int (*incSem)(ait_sess_t * __restrict); - int (*decSem)(ait_sess_t * __restrict); + int (*create)(int, long, void *, ...); + void (*destroy)(void *); + void *(*attach)(void *, void *); + void (*detach)(void *); + void (*notSem)(void *); + int (*isSemOK)(void *); + int (*incSem)(void *); + int (*decSem)(void *); } sess; -}; +} ait_sess_t; // ------------------------------------------------------- @@ -110,6 +149,80 @@ 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_purge() - Purge memory block cache and release resources + * + * @mp = Memory pool + * @atmost = Free at most in buckets + * return: -1 error or 0 ok + */ +int mpool_purge(mpool_t * __restrict mp, unsigned int atmost); +/* + * 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); +/* + * mpool_getsizebyaddr() - Get size of allocated memory block by address + * + * @data = allocated memory from mpool_malloc() + * return: usable size of allocated memory block + */ +inline unsigned int mpool_getsizebyaddr(void * __restrict data); +/* + * mpool_chkaddr() - Check validity of given address + * + * @data = allocated memory from mpool_malloc() + * return: -1 bad address, 1 corrupted address or 0 ok + */ +inline int mpool_chkaddr(void * __restrict data); + + +/* * 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,52 +234,47 @@ int sess_initSession(int id, const char *csFName, ait_ /* * sess_freeSession() Free allocated memory for session item and delete session file if present name * - * @csFName = Session filename for delete, if NULL nothing delete * @Sess = Session item * return: none */ -void sess_freeSession(const char *csFName, ait_sess_t ** __restrict Sess); +void sess_freeSession(ait_sess_t ** __restrict Sess); /* * map_createSession() MMAP Created session and allocated resources * - * @csFName = Session name for identified * @nSeed = Seed for securing key, if =-1 must add ready for use key * @nSize = Allocated shared memory size in bytes * @Sess = Session item * @... = If nSeed == -1 add ready for use key value * return: 0 Ok successful, -1 error: not allocated resources */ -int map_createSession(const char *csFName, int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); +int map_createSession(int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); /* * map_destroySession() MMAP free shared resources * - * @csFName = Session name for delete * @Sess = Session item * return: none */ -void map_destroySession(const char *csFName, ait_sess_t * __restrict Sess); +void map_destroySession(ait_sess_t * __restrict Sess); /* * ipc_createSession() IPC Created session and allocated resources * - * @csFName = Session name for identified * @nSeed = Seed for securing key, if =-1 must add ready for use key * @nSize = Allocated shared memory size in bytes * @Sess = Session item * @... = If nSeed == -1 add ready for use key value * return: 0 Ok successful, -1 error: not allocated resources */ -int ipc_createSession(const char *csFName, int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); +int ipc_createSession(int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); /* * ipc_destroySession() IPC free shared resources * - * @csFName = Session name for delete * @Sess = Session item * return: none */ -void ipc_destroySession(const char *csFName, ait_sess_t * __restrict Sess); +void ipc_destroySession(ait_sess_t * __restrict Sess); /* * map_attachSession() MMAP Attach to shared memory & return begin address @@ -270,19 +378,16 @@ int ipc_decSemaphore(ait_sess_t * __restrict s); /* --------------------------------------------------------- */ -#define CREATE_SESSION(fname, sd, siz, s, ...) (assert((s)), (s)->sess.create((fname), (sd), \ - (siz), (s), ## __VA_ARGS__)) -#define DESTROY_SESSION(fname, s) do { assert((s)); \ - (s)->sess.destroy((fname), (s)); \ - } while(0) +#define ALLOC_MEMORY(sd, siz, s, ...) (assert((s)), (s)->sess.create((sd), \ + (siz), (s), ## __VA_ARGS__)) +#define ATTACH_MEMORY(s) (assert((s)), (s)->sess.attach((s), NULL)) +#define DETACH_MEMORY(s) do { assert((s)); (s)->sess.detach((s)); } while(0) +#define FREE_MEMORY(s) do { assert((s)); (s)->sess.destroy((s)); } while(0) -#define ATTACH_MEMORY(s) (assert((s)), (s)->sess.attach((s), NULL)) -#define DETACH_MEMORY(s) do { assert((s)); (s)->sess.detach((s)); } while(0) - -#define IS_SEMOK(s) (assert((s)), (s)->sess.isSemOK((s))) -#define INC_SEM(s) (assert((s)), (s)->sess.incSem((s))) -#define DEC_SEM(s) (assert((s)), (s)->sess.decSem((s))) -#define NOT_SEM(s) do { assert((s)); (s)->sess.notSem((s)); } while(0) +#define IS_SEMOK(s) (assert((s)), (s)->sess.isSemOK((s))) +#define INC_SEM(s) (assert((s)), (s)->sess.incSem((s))) +#define DEC_SEM(s) (assert((s)), (s)->sess.decSem((s))) +#define NOT_SEM(s) do { assert((s)); (s)->sess.notSem((s)); } while(0) /* --------------------------------------------------------- */