version 1.1.2.2, 2013/03/13 14:48:08
|
version 1.5, 2013/06/26 22:48:53
|
Line 48 SUCH DAMAGE.
|
Line 48 SUCH DAMAGE.
|
|
|
|
|
#include <pthread.h> |
#include <pthread.h> |
#include <assert.h> |
|
#include <semaphore.h> |
#include <semaphore.h> |
#include <elwix.h> |
#include <elwix.h> |
|
#include <aitio.h> |
|
|
#define SHARED_UNKNOWN -1 |
#define SHARED_UNKNOWN -1 |
#define SHARED_IPC 0 |
#define SHARED_IPC 0 |
#define SHARED_MAP 1 |
#define SHARED_MAP 1 |
|
|
#define IS_VAL 0x0 | #define SESS_OPT_SEED -1 |
#define IS_ADD 0x40000000 | |
#define IS_DEF 0x80000000 | |
|
|
#define ISNEW(x) (((x) & IS_ADD) == IS_ADD) | #define SESS_F_ADD 0x10000000 |
#define ISDEF(x) (((x) & IS_DEF) == IS_DEF) | #define SESS_F_DEF 0x20000000 |
|
|
#define MAX_ATTRIBUTE 64 | #define SESS_RET_NEW(x) (((x) & SESS_F_ADD) == SESS_F_ADD) |
#define MAX_SEMNAME 14 | #define SESS_RET_DEF(x) (((x) & SESS_F_DEF) == SESS_F_DEF) |
| #define SESS_RET_VAL(x) ((x) & 0x0fffffff) |
|
|
|
|
/* Shared memory session */ |
/* Shared memory session */ |
|
|
typedef struct tagSess { |
typedef struct tagSess { |
key_t key; | key_t sess_key; |
char type; | char sess_type; |
char zcpy; | char sess_zcpy; |
|
|
char name[BUFSIZ]; | char sess_name[STRSIZ]; |
off_t eom; | off_t sess_size; |
void *addr; | void *sess_addr; |
off_t offset; | off_t sess_offset; |
| |
union { |
union { |
int shmid; |
int shmid; |
int fd; |
int fd; |
} mem; | } sess_mem; |
union { |
union { |
int semid; |
int semid; |
sem_t *sid; |
sem_t *sid; |
} id; | } sess_id; |
|
|
|
/* Session callbacks */ |
struct { |
struct { |
int (*create)(int, long, void *, ...); |
int (*create)(int, long, void *, ...); |
void (*destroy)(void *); |
void (*destroy)(void *); |
Line 97 typedef struct tagSess {
|
Line 97 typedef struct tagSess {
|
int (*incSem)(void *); |
int (*incSem)(void *); |
int (*decSem)(void *); |
int (*decSem)(void *); |
} sess; |
} 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, |
* sess_initSession() - Initializing session structure, |
* if session file not exists creating with specified tech |
* if session file not exists creating with specified tech |
Line 109 typedef struct tagSess {
|
Line 124 typedef struct tagSess {
|
* @Sess = Session item, if =NULL allocate memory for session after use must be free! |
* @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 |
* 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_freeSession() - Free allocated memory for session item and delete session file if present name |
* |
* |
* @Sess = Session item |
* @Sess = Session item |
* return: none |
* 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 |
* 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 |
* @nSize = Allocated shared memory size in bytes |
* @Sess = Session item |
* @Sess = Session item |
* @... = If nSeed == -1 add ready for use key value |
* @... = If nSeed == -1 add ready for use key value |
* return: 0 Ok successful, -1 error: not allocated resources |
* 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 |
* map_destroySession() - MMAP free shared resources |
* |
* |
* @Sess = Session item |
* @Sess = Session item |
* return: none |
* 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 |
* 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 |
* @nSize = Allocated shared memory size in bytes |
* @Sess = Session item |
* @Sess = Session item |
* @... = If nSeed == -1 add ready for use key value |
* @... = If nSeed == -1 add ready for use key value |
* return: 0 Ok successful, -1 error: not allocated resources |
* 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 |
* ipc_destroySession() - IPC free shared resources |
* |
* |
* @Sess = Session item |
* @Sess = Session item |
* return: none |
* 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 |
* map_attachSession() - MMAP Attach to shared memory & return begin address |
Line 161 void ipc_destroySession(ait_sess_t * __restrict Sess);
|
Line 176 void ipc_destroySession(ait_sess_t * __restrict Sess);
|
* @procMem = Custom start address (optionl) *default must be 0* |
* @procMem = Custom start address (optionl) *default must be 0* |
* return: NULL failed attach, !=NULL begin address of memory |
* 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 |
* map_detachSession() - MMAP Detach from shared memory |
* |
* |
* @s = Session item |
* @s = Session item |
* return: none |
* 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 |
* ipc_attachSession() - IPC Attach to shared memory & return begin address |
Line 177 void map_detachSession(ait_sess_t * __restrict s);
|
Line 192 void map_detachSession(ait_sess_t * __restrict s);
|
* @procMem = Custom start address (optionl) *default must be 0* |
* @procMem = Custom start address (optionl) *default must be 0* |
* return: NULL failed attach, !=NULL begin address of memory |
* 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 |
* ipc_detachSession() - IPC Detach from shared memory |
* |
* |
* @s = Session item |
* @s = Session item |
* return: none |
* return: none |
*/ |
*/ |
void ipc_detachSession(ait_sess_t * __restrict s); | void ipc_detachSession(sess_t * __restrict s); |
|
|
/* |
/* |
* sess_isAttached() - Check for attached shared memory |
* sess_isAttached() - Check for attached shared memory |
Line 192 void ipc_detachSession(ait_sess_t * __restrict s);
|
Line 207 void ipc_detachSession(ait_sess_t * __restrict s);
|
* @s = Session item |
* @s = Session item |
* return: -1 null session item, 0 not attached, 1 attached memory |
* 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); |
|
|
|
|
/* |
/* |
Line 201 inline int sess_isAttached(ait_sess_t * __restrict s);
|
Line 216 inline int sess_isAttached(ait_sess_t * __restrict s);
|
* @s = Session item |
* @s = Session item |
* return: none |
* return: none |
*/ |
*/ |
void map_notSemaphore(ait_sess_t * __restrict s); | void map_notSemaphore(sess_t * __restrict s); |
/* |
/* |
* map_isSemaphoreOK() - MMAP Check semaphore |
* map_isSemaphoreOK() - MMAP Check semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: -1 error: can`t return semaphore, 0 = false, 1 = true |
* 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 |
* map_incSemaphore() - MMAP unblock semaphore, increment semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: 0 Ok, -1 error: can`t increment |
* 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 |
* map_decSemaphore() - MMAP block semaphore, decrement semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: 0 Ok, -1 error: can`t decrement |
* 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 |
* ipc_notSemaphore() - IPC negative block if semaphore isn`t signaled |
Line 230 int map_decSemaphore(ait_sess_t * __restrict s);
|
Line 245 int map_decSemaphore(ait_sess_t * __restrict s);
|
* @s = Session item |
* @s = Session item |
* return: none |
* return: none |
*/ |
*/ |
void ipc_notSemaphore(ait_sess_t * __restrict s); | void ipc_notSemaphore(sess_t * __restrict s); |
/* |
/* |
* ipc_isSemaphoreOK() - IPC Check semaphore |
* ipc_isSemaphoreOK() - IPC Check semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: -1 error: can`t return semaphore, 0 = false, 1 = true |
* 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 |
* ipc_incSemaphore() - IPC unblock semaphore, increment semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: 0 Ok, -1 error: can`t increment |
* 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 |
* ipc_decSemaphore() - IPC block semaphore, decrement semaphore |
* |
* |
* @s = Session item |
* @s = Session item |
* return: 0 Ok, -1 error: can`t decrement |
* 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 |
* sess_GetValues() - Get all values from session shared memory |
* |
* |
* @s = Session item |
* @s = Session item |
* @ppsVals = Return array strings | * @Vals = Return array strings |
* return: -1 error: in parameter, !=-1 count of returned strings in ppsVals | * return: -1 error: in parameter, !=-1 count of returned strings in Vals |
* (must be sess_FreeValues after use!) | * (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 |
* sess_GetValue() - Get value from session shared memory from attribute |
* |
* |
* @s = Session item |
* @s = Session item |
* @csAttr = Attribute for search |
* @csAttr = Attribute for search |
* @psVal = Return string buffer | * @v = Return string value and after use must call ait_freeVar(), also may be =NULL |
* @pnLen = Length of return string buffer, | |
// *{pnLen} input is max_size of buffer & output is really taken bytes | |
* return: 0 not found, -1 error: in parameter, >0 get position, |
* return: 0 not found, -1 error: in parameter, >0 get position, |
* if define item merged with IS_DEF |
* 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 |
* sess_DelValue() - Delete item from session shared memory |
* |
* |
* @s = Session item |
* @s = Session item |
* @csAttr = Attribute for erasing |
* @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 |
* sess_SetValue() - Set item into session shared memory or update if exists |
* |
* |
Line 312 int sess_DelValue(ait_sess_t * __restrict s, const cha
|
Line 303 int sess_DelValue(ait_sess_t * __restrict s, const cha
|
* @csAttr = Attribute |
* @csAttr = Attribute |
* @psVal = Value |
* @psVal = Value |
* return: 0 nothing, -1 error: in parameter, |
* 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 |
* sess_prepareSession() - Attach to shared memory and de-marshaling data |
Line 324 int sess_SetValue(ait_sess_t * __restrict s, const cha
|
Line 316 int sess_SetValue(ait_sess_t * __restrict s, const cha
|
* return: NULL error or no data, !=NULL array with variables, |
* return: NULL error or no data, !=NULL array with variables, |
* after use must free resources with sess_doneSession() |
* 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() |
* sess_doneSession() - Free resources allocated with sess_prepareSession() |
* |
* |
Line 332 array_t *sess_prepareSession(ait_sess_t * __restrict s
|
Line 324 array_t *sess_prepareSession(ait_sess_t * __restrict s
|
* @arr = Array with variables for free |
* @arr = Array with variables for free |
* return: none |
* 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 |
* sess_commitSession() - Commit data to shared memory |
* |
* |
Line 340 void sess_doneSession(ait_sess_t * __restrict s, array
|
Line 332 void sess_doneSession(ait_sess_t * __restrict s, array
|
* @arr = Array with variables for save |
* @arr = Array with variables for save |
* return -1 error or !=-1 size of stored variables into shared memory |
* 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 |
#endif |