File:  [ELWIX - Embedded LightWeight unIX -] / libaitsess / inc / aitsess.h
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Sat Apr 30 21:35:21 2011 UTC (13 years, 2 months ago) by misho
Branches: MAIN
CVS tags: sess2_1, SESS2_0, HEAD
VER 2.0

    1: /*************************************************************************
    2: * (C) 2008 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
    3: *  by Michael Pounov <misho@openbsd-bg.org>
    4: *
    5: * $Author: misho $
    6: * $Id: aitsess.h,v 1.2 2011/04/30 21:35:21 misho Exp $
    7: *
    8: *************************************************************************/
    9: #ifndef __AITSESS_H
   10: #define __AITSESS_H
   11: 
   12: 
   13: #include <semaphore.h>
   14: #include <sys/types.h>
   15: 
   16: #define SHARED_IPC	1
   17: #define SHARED_MAP	2
   18: 
   19: #define IS_VAL		0x0
   20: #define IS_ADD		0x40000000
   21: #define IS_DEF		0x80000000
   22: 
   23: #define ISNEW(x)	(((x) & IS_ADD) == IS_ADD)
   24: #define ISDEF(x)	(((x) & IS_DEF) == IS_DEF)
   25: 
   26: #define MAX_ATTRIBUTE	63
   27: #define MAX_SEMNAME	14
   28: 
   29: 
   30: typedef struct _tagSess {
   31: 	key_t	key;
   32: 	u_char	type;
   33: 	off_t	eom;
   34: 	void	*addr;
   35: 	off_t	offset;
   36: 	union {
   37: 		int	shmid;
   38: 		int	fd;
   39: 	} mem;
   40: 	union {
   41: 		int	semid;
   42: 		sem_t	*sid;
   43: 	} id;
   44: } tagSess;
   45: 
   46: 
   47: // -------------------------------------------------------
   48: // sess_GetErrno() Get error code of last operation
   49: inline int sess_GetErrno();
   50: // sess_GetError() Get error text of last operation
   51: inline const char *sess_GetError();
   52: // -------------------------------------------------------
   53: 
   54: 
   55: /*
   56:  * initSession() Initializing session structure, if session file not exists creating with specified tech
   57:  * @cnID = Technology using in session. SHARED_IPC IPC tech; SHARED_MAP BSD MemoryMap tech
   58:  * @csFName = Session filename for build key and identified
   59:  * @Sess = Session item
   60:  * return: 0 OK new key created, -1 error: no memory or file not created, 1 OK key finded
   61: */
   62: inline int initSession(const int cnID, const char *csFName, tagSess ** __restrict Sess);
   63: /*
   64:  * freeSession() Free allocated memory for session item and delete session file if present name
   65:  * @csFName = Session filename for delete, if NULL nothing delete
   66:  * @Sess = Session item
   67: */
   68: inline void freeSession(const char *csFName, tagSess ** __restrict Sess);
   69: 
   70: /*
   71:  * map_createSession() MMAP Created session and allocated resources
   72:  * @csFName = Session name for identified
   73:  * @cnSeed = Seed for securing key
   74:  * @cnSize = Allocated shared memory size in bytes
   75:  * @Sess = Session item
   76:  * return: 0 Ok successful, -1 error: not allocated resources
   77: */
   78: int map_createSession(const char *csFName, const int cnSeed, const u_int cnSize, tagSess ** __restrict Sess);
   79: /*
   80:  * map_destroySession() MMAP free shared resources
   81:  * @csFName = Session name for delete
   82:  * @Sess = Session item
   83: */
   84: void map_destroySession(const char *csFName, tagSess ** __restrict Sess);
   85: 
   86: /*
   87:  * ipc_createSession() IPC Created session and allocated resources
   88:  * @csFName = Session name for identified
   89:  * @cnSeed = Seed for securing key
   90:  * @cnSize = Allocated shared memory size in bytes
   91:  * @Sess = Session item
   92:  * return: 0 Ok successful, -1 error: not allocated resources
   93: */
   94: int ipc_createSession(const char *csFName, const int cnSeed, const u_int cnSize, tagSess ** __restrict Sess);
   95: /*
   96:  * ipc_destroySession() IPC free shared resources
   97:  * @csFName = Session name for delete
   98:  * @Sess = Session item
   99: */
  100: void ipc_destroySession(const char *csFName, tagSess ** __restrict Sess);
  101: 
  102: /*
  103:  * map_attachSession() MMAP Attach to shared memory & return begin address
  104:  * @s = Session item
  105:  * @procMem = Custom start address (optionl) *default must be 0*
  106:  * return: NULL failed attach, !=NULL begin address of memory
  107: */
  108: inline void *map_attachSession(tagSess * __restrict s, void *procMem);
  109: /*
  110:  * map_detachSession() MMAP Detach from shared memory
  111:  * @s = Session item
  112: */
  113: inline void map_detachSession(tagSess * __restrict s);
  114: 
  115: /*
  116:  * ipc_attachSession() IPC Attach to shared memory & return begin address
  117:  * @s = Session item
  118:  * @procMem = Custom start address (optionl) *default must be 0*
  119:  * return: NULL failed attach, !=NULL begin address of memory
  120: */
  121: inline void *ipc_attachSession(tagSess * __restrict s, void *procMem);
  122: /*
  123:  * ipc_detachSession() IPC Detach from shared memory
  124:  * @s = Session item
  125: */
  126: inline void ipc_detachSession(tagSess * __restrict s);
  127: 
  128: /*
  129:  * isAttached() Check for mapped/(attached) shared memory
  130:  * @s = Session item
  131:  * return: -1 null session item, 0 not attached, 1 attached memory
  132: */
  133: inline int isAttached(tagSess * __restrict s);
  134: 
  135: 
  136: /*
  137:  * map_notSemaphore() MMAP negative block if semaphore isn`t signaled
  138:  * @s = Session item
  139: */
  140: inline void map_notSemaphore(tagSess * __restrict s);
  141: /*
  142:  * map_isSemaphored() MMAP Check semaphore
  143:  * @s = Session item
  144:  * return: -1 error: can`t return semaphore, 0 = false, 1 = true
  145: */
  146: inline int map_isSemaphored(tagSess * __restrict s);
  147: /*
  148:  * map_addSemaphore() MMAP unblock semaphore, increment semaphore
  149:  * @s = Session item
  150:  * return: 0 Ok, -1 error: can`t increment 
  151: */
  152: inline int map_addSemaphore(tagSess * __restrict s);
  153: /*
  154:  * map_decSemaphore() MMAP block semaphore, decrement semaphore
  155:  * @s = Session item
  156:  * return: 0 Ok, -1 error: can`t decrement 
  157: */
  158: inline int map_decSemaphore(tagSess * __restrict s);
  159: 
  160: /*
  161:  * ipc_notSemaphore() IPC negative block if semaphore isn`t signaled
  162:  * @s = Session item
  163: */
  164: inline void ipc_notSemaphore(tagSess * __restrict s);
  165: /*
  166:  * ipc_isSemaphored() IPC Check semaphore
  167:  * @s = Session item
  168:  * return: -1 error: can`t return semaphore, 0 = false, 1 = true
  169: */
  170: inline int ipc_isSemaphored(tagSess * __restrict s);
  171: /*
  172:  * ipc_addSemaphore() IPC unblock semaphore, increment semaphore
  173:  * @s = Session item
  174:  * return: 0 Ok, -1 error: can`t increment 
  175: */
  176: inline int ipc_addSemaphore(tagSess * __restrict s);
  177: /*
  178:  * ipc_decSemaphore() IPC block semaphore, decrement semaphore
  179:  * @s = Session item
  180:  * return: 0 Ok, -1 error: can`t decrement 
  181: */
  182: inline int ipc_decSemaphore(tagSess * __restrict s);
  183: 
  184: 
  185: // ---------------------------------------------------------
  186: //
  187: //  Lazy macros for lazy programmers :-) by Michael Pounov; Optimizing work with sessions!
  188: //
  189: 
  190: #define DESTROY_SESSION(fname, s)	do { \
  191: 						switch (((*s))->type) { \
  192: 							case SHARED_IPC: \
  193: 									 ipc_destroySession((fname), (s)); \
  194: 									 break; \
  195: 							case SHARED_MAP: \
  196: 									 map_destroySession((fname), (s)); \
  197: 									 break; \
  198: 						} \
  199: 					} while(0)
  200: 
  201: #define ATTACH_MEMORY(s)		do { \
  202: 						switch ((s)->type) { \
  203: 							case SHARED_IPC: \
  204: 									 ipc_attachSession((s), 0); \
  205: 									 break; \
  206: 							case SHARED_MAP: \
  207: 									 map_attachSession((s), 0); \
  208: 									 break; \
  209: 						} \
  210: 					} while(0)
  211: 
  212: #define DETACH_MEMORY(s)		do { \
  213: 						switch ((s)->type) { \
  214: 							case SHARED_IPC: \
  215: 									 ipc_detachSession((s)); \
  216: 									 break; \
  217: 							case SHARED_MAP: \
  218: 									 map_detachSession((s)); \
  219: 									 break; \
  220: 						} \
  221: 					} while(0)
  222: 
  223: #define NOT_SEMAPHORE(s)	do { \
  224: 					switch ((s)->type) { \
  225: 						case SHARED_IPC: \
  226: 								 ipc_notSemaphore((s)); \
  227: 								 break; \
  228: 						case SHARED_MAP: \
  229: 								 map_notSemaphore((s)); \
  230: 								 break; \
  231: 					} \
  232: 				} while(0)
  233: 
  234: #define IS_SEMAPHORED(s, ret)	do { \
  235: 					switch ((s)->type) { \
  236: 						case SHARED_IPC: \
  237: 								 (ret) = ipc_isSemaphored((s)); \
  238: 								 break; \
  239: 						case SHARED_MAP: \
  240: 								 (ret) = map_isSemaphored((s)); \
  241: 								 break; \
  242: 						default: \
  243: 							 (ret) = -1; \
  244: 					} \
  245: 				} while(0)
  246: 
  247: #define ADD_SEMAPHORE(s, ret)	do { \
  248: 					switch ((s)->type) { \
  249: 						case SHARED_IPC: \
  250: 								 (ret) = ipc_addSemaphore((s)); \
  251: 								 break; \
  252: 						case SHARED_MAP: \
  253: 								 (ret) = map_addSemaphore((s)); \
  254: 								 break; \
  255: 						default: \
  256: 							 (ret) = -1; \
  257: 					} \
  258: 				} while(0)
  259: 
  260: #define DEC_SEMAPHORE(s, ret)	do { \
  261: 					switch ((s)->type) { \
  262: 						case SHARED_IPC: \
  263: 								 (ret) = ipc_decSemaphore((s)); \
  264: 								 break; \
  265: 						case SHARED_MAP: \
  266: 								 (ret) = map_decSemaphore((s)); \
  267: 								 break; \
  268: 						default: \
  269: 							 (ret) = -1; \
  270: 					} \
  271: 				} while(0)
  272: 
  273: // ---------------------------------------------------------
  274: 
  275: /*
  276:  * sess_FreeValues() Free all values from value array allocated from sess_GetValues()
  277:  * @ppsVals = Array strings
  278:  * return: none
  279: */
  280: inline void sess_FreeValues(char *** __restrict ppsVals);
  281: /*
  282:  * sess_GetValues() Get all values from session shared memory
  283:  * @s = Session item
  284:  * @ppsVals = Return array strings
  285:  * return: -1 error: in parameter, !=-1 count of returned strings in ppsVals (must be free after use!)
  286: */
  287: int sess_GetValues(tagSess * __restrict s, char ***ppsVals);
  288: /*
  289:  * sess_GetValue() Get value from session shared memory from attribute
  290:  * @s = Session item
  291:  * @csAttr = Attribute for search
  292:  * @psVal = Return string buffer
  293:  * @pnLen = Length of return string buffer, 
  294: 	// *{pnLen} input is max_size of buffer & output is really taken bytes
  295:  * return: 0 not found, -1 error: in parameter, >0 get position, if define item merged with IS_DEF
  296: */
  297: int sess_GetValue(tagSess * __restrict s, const char *csAttr, char *psVal, int *pnLen);
  298: /*
  299:  * sess_DelValue() Delete item from session shared memory
  300:  * @s = Session item
  301:  * @csAttr = Attribute for erasing
  302:  * return: 0 Ok, -1 error: in parameter
  303: */
  304: int sess_DelValue(tagSess * __restrict s, const char *csAttr);
  305: /*
  306:  * sess_SetValue() Set item into session shared memory or update if find it
  307:  * @s = Session item
  308:  * @csAttr = Attribute
  309:  * @psVal = Value
  310:  * return: 0 nothing, -1 error: in parameter, 
  311:  	>0 set position, if add item merged with IS_ADD and if define item merged with IS_DEF
  312: */
  313: int sess_SetValue(tagSess * __restrict s, const char *csAttr, const char *psVal);
  314: 
  315: 
  316: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>