Annotation of libaitsess/inc/aitsess.h, revision 1.3

1.2       misho       1: /*************************************************************************
                      2: * (C) 2008 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
                      3: *  by Michael Pounov <misho@openbsd-bg.org>
                      4: *
                      5: * $Author: misho $
1.3     ! misho       6: * $Id: aitsess.h,v 1.2.2.3 2011/08/21 14:18:52 misho Exp $
1.2       misho       7: *
1.3     ! misho       8: **************************************************************************
        !             9: The ELWIX and AITNET software is distributed under the following
        !            10: terms:
        !            11: 
        !            12: All of the documentation and software included in the ELWIX and AITNET
        !            13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
        !            14: 
        !            15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
        !            16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        !            17: 
        !            18: Redistribution and use in source and binary forms, with or without
        !            19: modification, are permitted provided that the following conditions
        !            20: are met:
        !            21: 1. Redistributions of source code must retain the above copyright
        !            22:    notice, this list of conditions and the following disclaimer.
        !            23: 2. Redistributions in binary form must reproduce the above copyright
        !            24:    notice, this list of conditions and the following disclaimer in the
        !            25:    documentation and/or other materials provided with the distribution.
        !            26: 3. All advertising materials mentioning features or use of this software
        !            27:    must display the following acknowledgement:
        !            28: This product includes software developed by Michael Pounov <misho@elwix.org>
        !            29: ELWIX - Embedded LightWeight unIX and its contributors.
        !            30: 4. Neither the name of AITNET nor the names of its contributors
        !            31:    may be used to endorse or promote products derived from this software
        !            32:    without specific prior written permission.
        !            33: 
        !            34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        !            35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44: SUCH DAMAGE.
        !            45: */
1.1       misho      46: #ifndef __AITSESS_H
                     47: #define __AITSESS_H
                     48: 
                     49: 
1.3     ! misho      50: #include <assert.h>
1.1       misho      51: #include <semaphore.h>
                     52: #include <sys/types.h>
                     53: 
1.3     ! misho      54: #define SHARED_UNKNOWN 0
1.1       misho      55: #define SHARED_IPC     1
                     56: #define SHARED_MAP     2
                     57: 
                     58: #define IS_VAL         0x0
                     59: #define IS_ADD         0x40000000
                     60: #define IS_DEF         0x80000000
                     61: 
                     62: #define ISNEW(x)       (((x) & IS_ADD) == IS_ADD)
                     63: #define ISDEF(x)       (((x) & IS_DEF) == IS_DEF)
                     64: 
                     65: #define MAX_ATTRIBUTE  63
                     66: #define MAX_SEMNAME    14
                     67: 
                     68: 
                     69: typedef struct _tagSess {
                     70:        key_t   key;
                     71:        u_char  type;
                     72:        off_t   eom;
                     73:        void    *addr;
                     74:        off_t   offset;
                     75:        union {
                     76:                int     shmid;
                     77:                int     fd;
                     78:        } mem;
                     79:        union {
                     80:                int     semid;
                     81:                sem_t   *sid;
                     82:        } id;
                     83: } tagSess;
                     84: 
                     85: 
                     86: // -------------------------------------------------------
                     87: // sess_GetErrno() Get error code of last operation
                     88: inline int sess_GetErrno();
                     89: // sess_GetError() Get error text of last operation
                     90: inline const char *sess_GetError();
                     91: // -------------------------------------------------------
                     92: 
                     93: 
                     94: /*
                     95:  * initSession() Initializing session structure, if session file not exists creating with specified tech
1.3     ! misho      96:  * @pnID = Technology using in session. 
        !            97:        SHARED_IPC IPC tech; SHARED_MAP BSD MemoryMap tech or if =NULL SHARED_IPC
1.1       misho      98:  * @csFName = Session filename for build key and identified
1.3     ! misho      99:  * @Sess = Session item, if =NULL allocate memory for session after use must be free!
1.1       misho     100:  * return: 0 OK new key created, -1 error: no memory or file not created, 1 OK key finded
                    101: */
1.3     ! misho     102: inline int initSession(int *pnID, const char *csFName, tagSess ** __restrict Sess);
1.1       misho     103: /*
                    104:  * freeSession() Free allocated memory for session item and delete session file if present name
                    105:  * @csFName = Session filename for delete, if NULL nothing delete
                    106:  * @Sess = Session item
                    107: */
                    108: inline void freeSession(const char *csFName, tagSess ** __restrict Sess);
                    109: 
                    110: /*
                    111:  * map_createSession() MMAP Created session and allocated resources
                    112:  * @csFName = Session name for identified
                    113:  * @cnSeed = Seed for securing key
                    114:  * @cnSize = Allocated shared memory size in bytes
                    115:  * @Sess = Session item
                    116:  * return: 0 Ok successful, -1 error: not allocated resources
                    117: */
                    118: int map_createSession(const char *csFName, const int cnSeed, const u_int cnSize, tagSess ** __restrict Sess);
                    119: /*
                    120:  * map_destroySession() MMAP free shared resources
                    121:  * @csFName = Session name for delete
                    122:  * @Sess = Session item
                    123: */
                    124: void map_destroySession(const char *csFName, tagSess ** __restrict Sess);
                    125: 
                    126: /*
                    127:  * ipc_createSession() IPC Created session and allocated resources
                    128:  * @csFName = Session name for identified
                    129:  * @cnSeed = Seed for securing key
                    130:  * @cnSize = Allocated shared memory size in bytes
                    131:  * @Sess = Session item
                    132:  * return: 0 Ok successful, -1 error: not allocated resources
                    133: */
                    134: int ipc_createSession(const char *csFName, const int cnSeed, const u_int cnSize, tagSess ** __restrict Sess);
                    135: /*
                    136:  * ipc_destroySession() IPC free shared resources
                    137:  * @csFName = Session name for delete
                    138:  * @Sess = Session item
                    139: */
                    140: void ipc_destroySession(const char *csFName, tagSess ** __restrict Sess);
                    141: 
                    142: /*
                    143:  * map_attachSession() MMAP Attach to shared memory & return begin address
                    144:  * @s = Session item
                    145:  * @procMem = Custom start address (optionl) *default must be 0*
                    146:  * return: NULL failed attach, !=NULL begin address of memory
                    147: */
                    148: inline void *map_attachSession(tagSess * __restrict s, void *procMem);
                    149: /*
                    150:  * map_detachSession() MMAP Detach from shared memory
                    151:  * @s = Session item
                    152: */
                    153: inline void map_detachSession(tagSess * __restrict s);
                    154: 
                    155: /*
                    156:  * ipc_attachSession() IPC Attach to shared memory & return begin address
                    157:  * @s = Session item
                    158:  * @procMem = Custom start address (optionl) *default must be 0*
                    159:  * return: NULL failed attach, !=NULL begin address of memory
                    160: */
                    161: inline void *ipc_attachSession(tagSess * __restrict s, void *procMem);
                    162: /*
                    163:  * ipc_detachSession() IPC Detach from shared memory
                    164:  * @s = Session item
                    165: */
                    166: inline void ipc_detachSession(tagSess * __restrict s);
                    167: 
                    168: /*
1.2       misho     169:  * isAttached() Check for mapped/(attached) shared memory
                    170:  * @s = Session item
                    171:  * return: -1 null session item, 0 not attached, 1 attached memory
                    172: */
                    173: inline int isAttached(tagSess * __restrict s);
                    174: 
                    175: 
                    176: /*
1.1       misho     177:  * map_notSemaphore() MMAP negative block if semaphore isn`t signaled
                    178:  * @s = Session item
                    179: */
                    180: inline void map_notSemaphore(tagSess * __restrict s);
                    181: /*
                    182:  * map_isSemaphored() MMAP Check semaphore
                    183:  * @s = Session item
                    184:  * return: -1 error: can`t return semaphore, 0 = false, 1 = true
                    185: */
                    186: inline int map_isSemaphored(tagSess * __restrict s);
                    187: /*
                    188:  * map_addSemaphore() MMAP unblock semaphore, increment semaphore
                    189:  * @s = Session item
                    190:  * return: 0 Ok, -1 error: can`t increment 
                    191: */
                    192: inline int map_addSemaphore(tagSess * __restrict s);
                    193: /*
                    194:  * map_decSemaphore() MMAP block semaphore, decrement semaphore
                    195:  * @s = Session item
                    196:  * return: 0 Ok, -1 error: can`t decrement 
                    197: */
                    198: inline int map_decSemaphore(tagSess * __restrict s);
                    199: 
                    200: /*
                    201:  * ipc_notSemaphore() IPC negative block if semaphore isn`t signaled
                    202:  * @s = Session item
                    203: */
                    204: inline void ipc_notSemaphore(tagSess * __restrict s);
                    205: /*
                    206:  * ipc_isSemaphored() IPC Check semaphore
                    207:  * @s = Session item
                    208:  * return: -1 error: can`t return semaphore, 0 = false, 1 = true
                    209: */
                    210: inline int ipc_isSemaphored(tagSess * __restrict s);
                    211: /*
                    212:  * ipc_addSemaphore() IPC unblock semaphore, increment semaphore
                    213:  * @s = Session item
                    214:  * return: 0 Ok, -1 error: can`t increment 
                    215: */
                    216: inline int ipc_addSemaphore(tagSess * __restrict s);
                    217: /*
                    218:  * ipc_decSemaphore() IPC block semaphore, decrement semaphore
                    219:  * @s = Session item
                    220:  * return: 0 Ok, -1 error: can`t decrement 
                    221: */
                    222: inline int ipc_decSemaphore(tagSess * __restrict s);
                    223: 
1.2       misho     224: 
1.1       misho     225: // ---------------------------------------------------------
                    226: //
                    227: //  Lazy macros for lazy programmers :-) by Michael Pounov; Optimizing work with sessions!
                    228: //
                    229: 
1.3     ! misho     230: #define DESTROY_SESSION(fname, s)      do { assert((s)); assert((*s)); \
1.2       misho     231:                                                switch (((*s))->type) { \
1.1       misho     232:                                                        case SHARED_IPC: \
                    233:                                                                         ipc_destroySession((fname), (s)); \
                    234:                                                                         break; \
                    235:                                                        case SHARED_MAP: \
                    236:                                                                         map_destroySession((fname), (s)); \
                    237:                                                                         break; \
                    238:                                                } \
                    239:                                        } while(0)
                    240: 
1.3     ! misho     241: #define ATTACH_MEMORY(s)               do { assert((s)); \
1.1       misho     242:                                                switch ((s)->type) { \
                    243:                                                        case SHARED_IPC: \
1.2       misho     244:                                                                         ipc_attachSession((s), 0); \
1.1       misho     245:                                                                         break; \
                    246:                                                        case SHARED_MAP: \
1.2       misho     247:                                                                         map_attachSession((s), 0); \
1.1       misho     248:                                                                         break; \
                    249:                                                } \
                    250:                                        } while(0)
                    251: 
1.3     ! misho     252: #define DETACH_MEMORY(s)               do { assert((s)); \
1.1       misho     253:                                                switch ((s)->type) { \
                    254:                                                        case SHARED_IPC: \
                    255:                                                                         ipc_detachSession((s)); \
                    256:                                                                         break; \
                    257:                                                        case SHARED_MAP: \
                    258:                                                                         map_detachSession((s)); \
                    259:                                                                         break; \
                    260:                                                } \
                    261:                                        } while(0)
                    262: 
1.3     ! misho     263: #define NOT_SEMAPHORE(s)       do { assert((s)); \
1.1       misho     264:                                        switch ((s)->type) { \
                    265:                                                case SHARED_IPC: \
                    266:                                                                 ipc_notSemaphore((s)); \
                    267:                                                                 break; \
                    268:                                                case SHARED_MAP: \
                    269:                                                                 map_notSemaphore((s)); \
                    270:                                                                 break; \
                    271:                                        } \
                    272:                                } while(0)
                    273: 
1.3     ! misho     274: #define IS_SEMAPHORED(s, ret)  do { assert((s)); \
1.1       misho     275:                                        switch ((s)->type) { \
                    276:                                                case SHARED_IPC: \
                    277:                                                                 (ret) = ipc_isSemaphored((s)); \
                    278:                                                                 break; \
                    279:                                                case SHARED_MAP: \
                    280:                                                                 (ret) = map_isSemaphored((s)); \
                    281:                                                                 break; \
                    282:                                                default: \
                    283:                                                         (ret) = -1; \
                    284:                                        } \
                    285:                                } while(0)
                    286: 
1.3     ! misho     287: #define ADD_SEMAPHORE(s, ret)  do { assert((s)); \
1.1       misho     288:                                        switch ((s)->type) { \
                    289:                                                case SHARED_IPC: \
                    290:                                                                 (ret) = ipc_addSemaphore((s)); \
                    291:                                                                 break; \
                    292:                                                case SHARED_MAP: \
                    293:                                                                 (ret) = map_addSemaphore((s)); \
                    294:                                                                 break; \
                    295:                                                default: \
                    296:                                                         (ret) = -1; \
                    297:                                        } \
                    298:                                } while(0)
                    299: 
1.3     ! misho     300: #define DEC_SEMAPHORE(s, ret)  do { assert((s)); \
1.1       misho     301:                                        switch ((s)->type) { \
                    302:                                                case SHARED_IPC: \
                    303:                                                                 (ret) = ipc_decSemaphore((s)); \
                    304:                                                                 break; \
                    305:                                                case SHARED_MAP: \
                    306:                                                                 (ret) = map_decSemaphore((s)); \
                    307:                                                                 break; \
                    308:                                                default: \
                    309:                                                         (ret) = -1; \
                    310:                                        } \
                    311:                                } while(0)
                    312: 
                    313: // ---------------------------------------------------------
                    314: 
                    315: /*
1.2       misho     316:  * sess_FreeValues() Free all values from value array allocated from sess_GetValues()
                    317:  * @ppsVals = Array strings
                    318:  * return: none
                    319: */
                    320: inline void sess_FreeValues(char *** __restrict ppsVals);
                    321: /*
                    322:  * sess_GetValues() Get all values from session shared memory
                    323:  * @s = Session item
                    324:  * @ppsVals = Return array strings
                    325:  * return: -1 error: in parameter, !=-1 count of returned strings in ppsVals (must be free after use!)
                    326: */
                    327: int sess_GetValues(tagSess * __restrict s, char ***ppsVals);
                    328: /*
1.1       misho     329:  * sess_GetValue() Get value from session shared memory from attribute
                    330:  * @s = Session item
                    331:  * @csAttr = Attribute for search
                    332:  * @psVal = Return string buffer
                    333:  * @pnLen = Length of return string buffer, 
                    334:        // *{pnLen} input is max_size of buffer & output is really taken bytes
                    335:  * return: 0 not found, -1 error: in parameter, >0 get position, if define item merged with IS_DEF
                    336: */
                    337: int sess_GetValue(tagSess * __restrict s, const char *csAttr, char *psVal, int *pnLen);
                    338: /*
                    339:  * sess_DelValue() Delete item from session shared memory
                    340:  * @s = Session item
                    341:  * @csAttr = Attribute for erasing
                    342:  * return: 0 Ok, -1 error: in parameter
                    343: */
                    344: int sess_DelValue(tagSess * __restrict s, const char *csAttr);
                    345: /*
                    346:  * sess_SetValue() Set item into session shared memory or update if find it
                    347:  * @s = Session item
                    348:  * @csAttr = Attribute
                    349:  * @psVal = Value
                    350:  * return: 0 nothing, -1 error: in parameter, 
                    351:        >0 set position, if add item merged with IS_ADD and if define item merged with IS_DEF
                    352: */
                    353: int sess_SetValue(tagSess * __restrict s, const char *csAttr, const char *psVal);
                    354: 
                    355: 
                    356: #endif

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