--- libaitio/inc/aitsess.h 2013/03/13 14:54:39 1.2 +++ libaitio/inc/aitsess.h 2013/05/30 09:10:13 1.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsess.h,v 1.2 2013/03/13 14:54:39 misho Exp $ +* $Id: aitsess.h,v 1.4 2013/05/30 09:10:13 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -55,37 +55,37 @@ SUCH DAMAGE. #define SHARED_IPC 0 #define SHARED_MAP 1 -#define IS_VAL 0x0 -#define IS_ADD 0x40000000 -#define IS_DEF 0x80000000 +#define SESS_OPT_SEED -1 -#define ISNEW(x) (((x) & IS_ADD) == IS_ADD) -#define ISDEF(x) (((x) & IS_DEF) == IS_DEF) +#define SESS_F_ADD 0x10000000 +#define SESS_F_DEF 0x20000000 -#define MAX_ATTRIBUTE 64 -#define MAX_SEMNAME 14 +#define SESS_RET_NEW(x) (((x) & SESS_F_ADD) == SESS_F_ADD) +#define SESS_RET_DEF(x) (((x) & SESS_F_DEF) == SESS_F_DEF) +#define SESS_RET_VAL(x) ((x) & 0x0fffffff) - /* Shared memory session */ typedef struct tagSess { - key_t key; - char type; - char zcpy; + key_t sess_key; + char sess_type; + char sess_zcpy; - char name[BUFSIZ]; - off_t eom; - void *addr; - off_t offset; + char sess_name[STRSIZ]; + off_t sess_size; + void *sess_addr; + off_t sess_offset; + union { int shmid; int fd; - } mem; + } sess_mem; union { int semid; sem_t *sid; - } id; + } sess_id; + /* Session callbacks */ struct { int (*create)(int, long, void *, ...); void (*destroy)(void *); @@ -96,9 +96,24 @@ typedef struct tagSess { int (*incSem)(void *); int (*decSem)(void *); } sess; -} ait_sess_t; +} sess_t; +/* --------------------------------------------------------- */ +#define ALLOC_MEMORY(sd, siz, s, ...) (assert((s) && (s)->sess.create), \ + (s)->sess.create((sd), (siz), (s), ## __VA_ARGS__)) +#define ATTACH_MEMORY(s) (assert((s) && (s)->sess.attach), (s)->sess.attach((s), NULL)) +#define DETACH_MEMORY(s) (assert((s) && (s)->sess.detach), (s)->sess.detach((s))) +#define FREE_MEMORY(s) (assert((s) && (s)->sess.destroy), (s)->sess.destroy((s))) + +#define IS_SEMOK(s) (assert((s) && (s)->sess.isSemOK), (s)->sess.isSemOK((s))) +#define INC_SEM(s) (assert((s) && (s)->sess.incSem), (s)->sess.incSem((s))) +#define DEC_SEM(s) (assert((s) && (s)->sess.decSem), (s)->sess.decSem((s))) +#define NOT_SEM(s) (assert((s) && (s)->sess.notSem), (s)->sess.notSem((s))) + +/* --------------------------------------------------------- */ + + /* * sess_initSession() - Initializing session structure, * if session file not exists creating with specified tech @@ -108,50 +123,50 @@ typedef struct tagSess { * @Sess = Session item, if =NULL allocate memory for session after use must be free! * return: 0 OK new key created, -1 error: no memory or file not created, 1 OK key finded */ -int sess_initSession(int id, const char *csFName, ait_sess_t ** __restrict Sess); +int sess_initSession(int id, const char *csFName, sess_t ** __restrict Sess); /* * sess_freeSession() - Free allocated memory for session item and delete session file if present name * * @Sess = Session item * return: none */ -void sess_freeSession(ait_sess_t ** __restrict Sess); +void sess_freeSession(sess_t ** __restrict Sess); /* * map_createSession() - MMAP Created session and allocated resources * - * @nSeed = Seed for securing key, if =-1 must add ready for use key + * @nSeed = Seed for securing key, if =SESS_OPT_SEED 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(int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); +int map_createSession(int nSeed, long nSize, sess_t * __restrict Sess, ...); /* * map_destroySession() - MMAP free shared resources * * @Sess = Session item * return: none */ -void map_destroySession(ait_sess_t * __restrict Sess); +void map_destroySession(sess_t * __restrict Sess); /* * ipc_createSession() - IPC Created session and allocated resources * - * @nSeed = Seed for securing key, if =-1 must add ready for use key + * @nSeed = Seed for securing key, if =SESS_OPT_SEED 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(int nSeed, long nSize, ait_sess_t * __restrict Sess, ...); +int ipc_createSession(int nSeed, long nSize, sess_t * __restrict Sess, ...); /* * ipc_destroySession() - IPC free shared resources * * @Sess = Session item * return: none */ -void ipc_destroySession(ait_sess_t * __restrict Sess); +void ipc_destroySession(sess_t * __restrict Sess); /* * map_attachSession() - MMAP Attach to shared memory & return begin address @@ -160,14 +175,14 @@ void ipc_destroySession(ait_sess_t * __restrict Sess); * @procMem = Custom start address (optionl) *default must be 0* * return: NULL failed attach, !=NULL begin address of memory */ -void *map_attachSession(ait_sess_t * __restrict s, void *procMem); +void *map_attachSession(sess_t * __restrict s, void *procMem); /* * map_detachSession() - MMAP Detach from shared memory * * @s = Session item * return: none */ -void map_detachSession(ait_sess_t * __restrict s); +void map_detachSession(sess_t * __restrict s); /* * ipc_attachSession() - IPC Attach to shared memory & return begin address @@ -176,14 +191,14 @@ void map_detachSession(ait_sess_t * __restrict s); * @procMem = Custom start address (optionl) *default must be 0* * return: NULL failed attach, !=NULL begin address of memory */ -void *ipc_attachSession(ait_sess_t * __restrict s, void *procMem); +void *ipc_attachSession(sess_t * __restrict s, void *procMem); /* * ipc_detachSession() - IPC Detach from shared memory * * @s = Session item * return: none */ -void ipc_detachSession(ait_sess_t * __restrict s); +void ipc_detachSession(sess_t * __restrict s); /* * sess_isAttached() - Check for attached shared memory @@ -191,7 +206,7 @@ void ipc_detachSession(ait_sess_t * __restrict s); * @s = Session item * return: -1 null session item, 0 not attached, 1 attached memory */ -inline int sess_isAttached(ait_sess_t * __restrict s); +int sess_isAttached(sess_t * __restrict s); /* @@ -200,28 +215,28 @@ inline int sess_isAttached(ait_sess_t * __restrict s); * @s = Session item * return: none */ -void map_notSemaphore(ait_sess_t * __restrict s); +void map_notSemaphore(sess_t * __restrict s); /* * map_isSemaphoreOK() - MMAP Check semaphore * * @s = Session item * return: -1 error: can`t return semaphore, 0 = false, 1 = true */ -int map_isSemaphoreOK(ait_sess_t * __restrict s); +int map_isSemaphoreOK(sess_t * __restrict s); /* * map_incSemaphore() - MMAP unblock semaphore, increment semaphore * * @s = Session item * return: 0 Ok, -1 error: can`t increment */ -int map_incSemaphore(ait_sess_t * __restrict s); +int map_incSemaphore(sess_t * __restrict s); /* * map_decSemaphore() - MMAP block semaphore, decrement semaphore * * @s = Session item * return: 0 Ok, -1 error: can`t decrement */ -int map_decSemaphore(ait_sess_t * __restrict s); +int map_decSemaphore(sess_t * __restrict s); /* * ipc_notSemaphore() - IPC negative block if semaphore isn`t signaled @@ -229,81 +244,57 @@ int map_decSemaphore(ait_sess_t * __restrict s); * @s = Session item * return: none */ -void ipc_notSemaphore(ait_sess_t * __restrict s); +void ipc_notSemaphore(sess_t * __restrict s); /* * ipc_isSemaphoreOK() - IPC Check semaphore * * @s = Session item * return: -1 error: can`t return semaphore, 0 = false, 1 = true */ -int ipc_isSemaphoreOK(ait_sess_t * __restrict s); +int ipc_isSemaphoreOK(sess_t * __restrict s); /* * ipc_incSemaphore() - IPC unblock semaphore, increment semaphore * * @s = Session item * return: 0 Ok, -1 error: can`t increment */ -int ipc_incSemaphore(ait_sess_t * __restrict s); +int ipc_incSemaphore(sess_t * __restrict s); /* * ipc_decSemaphore() - IPC block semaphore, decrement semaphore * * @s = Session item * return: 0 Ok, -1 error: can`t decrement */ -int ipc_decSemaphore(ait_sess_t * __restrict s); +int ipc_decSemaphore(sess_t * __restrict s); -/* --------------------------------------------------------- */ - -#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 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) - -/* --------------------------------------------------------- */ - /* - * sess_FreeValues() - Free all values from value array allocated from sess_GetValues() - * - * @ppsVals = Array strings - * return: none - */ -inline void sess_FreeValues(char *** __restrict ppsVals); -/* * sess_GetValues() - Get all values from session shared memory * * @s = Session item - * @ppsVals = Return array strings - * return: -1 error: in parameter, !=-1 count of returned strings in ppsVals - * (must be sess_FreeValues after use!) + * @Vals = Return array strings + * return: -1 error: in parameter, !=-1 count of returned strings in Vals + * (must call ait_freeVars() after use!) */ -int sess_GetValues(ait_sess_t * __restrict s, char ***ppsVals); +int sess_GetValues(sess_t * __restrict s, array_t ** __restrict Vals); /* * sess_GetValue() - Get value from session shared memory from attribute * * @s = Session item * @csAttr = Attribute for search - * @psVal = Return string buffer - * @pnLen = Length of return string buffer, - // *{pnLen} input is max_size of buffer & output is really taken bytes + * @v = Return string value and after use must call ait_freeVar(), also may be =NULL * return: 0 not found, -1 error: in parameter, >0 get position, * if define item merged with IS_DEF */ -int sess_GetValue(ait_sess_t * __restrict s, const char *csAttr, char *psVal, int *pnLen); +int sess_GetValue(sess_t * __restrict s, const char *csAttr, ait_val_t ** __restrict v); /* * sess_DelValue() - Delete item from session shared memory * * @s = Session item * @csAttr = Attribute for erasing - * return: 0 Ok, -1 error: in parameter + * return: -1 error: in parameter or !=-1 deleted items */ -int sess_DelValue(ait_sess_t * __restrict s, const char *csAttr); +int sess_DelValue(sess_t * __restrict s, const char *csAttr); /* * sess_SetValue() - Set item into session shared memory or update if exists * @@ -311,9 +302,10 @@ int sess_DelValue(ait_sess_t * __restrict s, const cha * @csAttr = Attribute * @psVal = Value * return: 0 nothing, -1 error: in parameter, - >0 set position, if add item merged with IS_ADD and if define item merged with IS_DEF + >0 set position, if added new item merged with SESS_F_ADD and + if just define item merged with SESS_F_DEF */ -int sess_SetValue(ait_sess_t * __restrict s, const char *csAttr, const char *psVal); +int sess_SetValue(sess_t * __restrict s, const char *csAttr, const char *psVal); /* * sess_prepareSession() - Attach to shared memory and de-marshaling data @@ -323,7 +315,7 @@ int sess_SetValue(ait_sess_t * __restrict s, const cha * return: NULL error or no data, !=NULL array with variables, * after use must free resources with sess_doneSession() */ -array_t *sess_prepareSession(ait_sess_t * __restrict s, char useDirect); +array_t *sess_prepareSession(sess_t * __restrict s, char useDirect); /* * sess_doneSession() - Free resources allocated with sess_prepareSession() * @@ -331,7 +323,7 @@ array_t *sess_prepareSession(ait_sess_t * __restrict s * @arr = Array with variables for free * return: none */ -void sess_doneSession(ait_sess_t * __restrict s, array_t ** __restrict arr); +void sess_doneSession(sess_t * __restrict s, array_t ** __restrict arr); /* * sess_commitSession() - Commit data to shared memory * @@ -339,7 +331,7 @@ void sess_doneSession(ait_sess_t * __restrict s, array * @arr = Array with variables for save * return -1 error or !=-1 size of stored variables into shared memory */ -int sess_commitSession(ait_sess_t * __restrict s, array_t * __restrict arr); +int sess_commitSession(sess_t * __restrict s, array_t * __restrict arr); #endif