1*4e1bc9a0SAchim Leubner /******************************************************************************* 2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3*4e1bc9a0SAchim Leubner * 4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5*4e1bc9a0SAchim Leubner *that the following conditions are met: 6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7*4e1bc9a0SAchim Leubner *following disclaimer. 8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice, 9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10*4e1bc9a0SAchim Leubner *with the distribution. 11*4e1bc9a0SAchim Leubner * 12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20*4e1bc9a0SAchim Leubner * 21*4e1bc9a0SAchim Leubner * 22*4e1bc9a0SAchim Leubner ********************************************************************************/ 23*4e1bc9a0SAchim Leubner 24*4e1bc9a0SAchim Leubner #ifndef __SMLIST_H__ 25*4e1bc9a0SAchim Leubner #define __SMLIST_H__ 26*4e1bc9a0SAchim Leubner 27*4e1bc9a0SAchim Leubner typedef struct smList_s smList_t; 28*4e1bc9a0SAchim Leubner 29*4e1bc9a0SAchim Leubner struct smList_s { 30*4e1bc9a0SAchim Leubner smList_t *flink; 31*4e1bc9a0SAchim Leubner smList_t *blink; 32*4e1bc9a0SAchim Leubner }; 33*4e1bc9a0SAchim Leubner 34*4e1bc9a0SAchim Leubner #define SMLIST_INIT_HDR(hdr) \ 35*4e1bc9a0SAchim Leubner do { \ 36*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->flink = (smList_t *)(hdr); \ 37*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->blink = (smList_t *)(hdr); \ 38*4e1bc9a0SAchim Leubner } while (0) 39*4e1bc9a0SAchim Leubner 40*4e1bc9a0SAchim Leubner #define SMLIST_INIT_ELEMENT(hdr) \ 41*4e1bc9a0SAchim Leubner do { \ 42*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->flink = (smList_t *)agNULL; \ 43*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->blink = (smList_t *)agNULL; \ 44*4e1bc9a0SAchim Leubner } while (0) 45*4e1bc9a0SAchim Leubner 46*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr) \ 47*4e1bc9a0SAchim Leubner do { \ 48*4e1bc9a0SAchim Leubner ((smList_t *)(toAddHdr))->flink = ((smList_t *)(listHdr))->flink; \ 49*4e1bc9a0SAchim Leubner ((smList_t *)(toAddHdr))->blink = (smList_t *)(listHdr) ; \ 50*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->flink->blink = (smList_t *)(toAddHdr); \ 51*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->flink = (smList_t *)(toAddHdr); \ 52*4e1bc9a0SAchim Leubner } while (0) 53*4e1bc9a0SAchim Leubner 54*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr) \ 55*4e1bc9a0SAchim Leubner do { \ 56*4e1bc9a0SAchim Leubner ((smList_t *)(toAddHdr))->flink = (smList_t *)(listHdr); \ 57*4e1bc9a0SAchim Leubner ((smList_t *)(toAddHdr))->blink = ((smList_t *)(listHdr))->blink; \ 58*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->blink->flink = (smList_t *)(toAddHdr); \ 59*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->blink = (smList_t *)(toAddHdr); \ 60*4e1bc9a0SAchim Leubner } while (0) 61*4e1bc9a0SAchim Leubner 62*4e1bc9a0SAchim Leubner #define SMLIST_EMPTY(listHdr) \ 63*4e1bc9a0SAchim Leubner (((smList_t *)(listHdr))->flink == ((smList_t *)(listHdr))) 64*4e1bc9a0SAchim Leubner 65*4e1bc9a0SAchim Leubner #define SMLIST_NOT_EMPTY(listHdr) \ 66*4e1bc9a0SAchim Leubner (!SMLIST_EMPTY(listHdr)) 67*4e1bc9a0SAchim Leubner 68*4e1bc9a0SAchim Leubner #define SMLIST_DEQUEUE_THIS(hdr) \ 69*4e1bc9a0SAchim Leubner do { \ 70*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->blink->flink = ((smList_t *)(hdr))->flink; \ 71*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->flink->blink = ((smList_t *)(hdr))->blink; \ 72*4e1bc9a0SAchim Leubner ((smList_t *)(hdr))->flink = ((smList_t *)(hdr))->blink = agNULL; \ 73*4e1bc9a0SAchim Leubner } while (0) 74*4e1bc9a0SAchim Leubner 75*4e1bc9a0SAchim Leubner #define SMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr) \ 76*4e1bc9a0SAchim Leubner do { \ 77*4e1bc9a0SAchim Leubner *((smList_t **)(atHeadHdr)) = ((smList_t *)(listHdr))->flink; \ 78*4e1bc9a0SAchim Leubner (*((smList_t **)(atHeadHdr)))->flink->blink = (smList_t *)(listHdr); \ 79*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->flink = (*(smList_t **)(atHeadHdr))->flink; \ 80*4e1bc9a0SAchim Leubner } while (0) 81*4e1bc9a0SAchim Leubner 82*4e1bc9a0SAchim Leubner #define SMLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr) \ 83*4e1bc9a0SAchim Leubner do { \ 84*4e1bc9a0SAchim Leubner if (SMLIST_NOT_EMPTY((listHdr))) \ 85*4e1bc9a0SAchim Leubner { \ 86*4e1bc9a0SAchim Leubner SMLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr); \ 87*4e1bc9a0SAchim Leubner } \ 88*4e1bc9a0SAchim Leubner else \ 89*4e1bc9a0SAchim Leubner { \ 90*4e1bc9a0SAchim Leubner (*((smList_t **)(atHeadHdr))) = (smList_t *)agNULL; \ 91*4e1bc9a0SAchim Leubner } \ 92*4e1bc9a0SAchim Leubner } while (0) 93*4e1bc9a0SAchim Leubner 94*4e1bc9a0SAchim Leubner #define SMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr) \ 95*4e1bc9a0SAchim Leubner do { \ 96*4e1bc9a0SAchim Leubner (*((smList_t **)(atTailHdr))) = ((smList_t *)(listHdr))->blink; \ 97*4e1bc9a0SAchim Leubner (*((smList_t **)(atTailHdr)))->blink->flink = (smList_t *)(listHdr); \ 98*4e1bc9a0SAchim Leubner ((smList_t *)(listHdr))->blink = (*((smList_t **)(atTailHdr)))->blink; \ 99*4e1bc9a0SAchim Leubner } while (0) 100*4e1bc9a0SAchim Leubner 101*4e1bc9a0SAchim Leubner #define SMLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr) \ 102*4e1bc9a0SAchim Leubner do { \ 103*4e1bc9a0SAchim Leubner if (SMLIST_NOT_EMPTY((listHdr))) \ 104*4e1bc9a0SAchim Leubner { \ 105*4e1bc9a0SAchim Leubner SMLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr); \ 106*4e1bc9a0SAchim Leubner } \ 107*4e1bc9a0SAchim Leubner else \ 108*4e1bc9a0SAchim Leubner { \ 109*4e1bc9a0SAchim Leubner (*((smList_t **)(atTailHdr))) = (smList_t *)agNULL; \ 110*4e1bc9a0SAchim Leubner } \ 111*4e1bc9a0SAchim Leubner } while (0) 112*4e1bc9a0SAchim Leubner 113*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr) \ 114*4e1bc9a0SAchim Leubner do { \ 115*4e1bc9a0SAchim Leubner ((smList_t *)toAddListHdr)->blink->flink = ((smList_t *)listHdr); \ 116*4e1bc9a0SAchim Leubner ((smList_t *)toAddListHdr)->flink->blink = ((smList_t *)listHdr)->blink; \ 117*4e1bc9a0SAchim Leubner ((smList_t *)listHdr)->blink->flink = ((smList_t *)toAddListHdr)->flink; \ 118*4e1bc9a0SAchim Leubner ((smList_t *)listHdr)->blink = ((smList_t *)toAddListHdr)->blink; \ 119*4e1bc9a0SAchim Leubner SMLIST_INIT_HDR(toAddListHdr); \ 120*4e1bc9a0SAchim Leubner } while (0) 121*4e1bc9a0SAchim Leubner 122*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr) \ 123*4e1bc9a0SAchim Leubner do { \ 124*4e1bc9a0SAchim Leubner if (SMLIST_NOT_EMPTY(toAddListHdr)) \ 125*4e1bc9a0SAchim Leubner { \ 126*4e1bc9a0SAchim Leubner SMLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr); \ 127*4e1bc9a0SAchim Leubner } \ 128*4e1bc9a0SAchim Leubner } while (0) 129*4e1bc9a0SAchim Leubner 130*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr) \ 131*4e1bc9a0SAchim Leubner do { \ 132*4e1bc9a0SAchim Leubner ((smList_t *)toAddListHdr)->blink->flink = ((smList_t *)listHdr)->flink; \ 133*4e1bc9a0SAchim Leubner ((smList_t *)toAddListHdr)->flink->blink = ((smList_t *)listHdr); \ 134*4e1bc9a0SAchim Leubner ((smList_t *)listHdr)->flink->blink = ((smList_t *)toAddListHdr)->blink; \ 135*4e1bc9a0SAchim Leubner ((smList_t *)listHdr)->flink = ((smList_t *)toAddListHdr)->flink; \ 136*4e1bc9a0SAchim Leubner SMLIST_INIT_HDR(toAddListHdr); \ 137*4e1bc9a0SAchim Leubner } while (0) 138*4e1bc9a0SAchim Leubner 139*4e1bc9a0SAchim Leubner #define SMLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr) \ 140*4e1bc9a0SAchim Leubner do { \ 141*4e1bc9a0SAchim Leubner if (SMLIST_NOT_EMPTY(toAddListHdr)) \ 142*4e1bc9a0SAchim Leubner { \ 143*4e1bc9a0SAchim Leubner SMLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr); \ 144*4e1bc9a0SAchim Leubner } \ 145*4e1bc9a0SAchim Leubner } while (0) 146*4e1bc9a0SAchim Leubner 147*4e1bc9a0SAchim Leubner #define TD_FIELD_OFFSET(baseType,fieldName) \ 148*4e1bc9a0SAchim Leubner ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) 149*4e1bc9a0SAchim Leubner 150*4e1bc9a0SAchim Leubner #define SMLIST_OBJECT_BASE(baseType,fieldName,fieldPtr) \ 151*4e1bc9a0SAchim Leubner (void *)fieldPtr == (void *)0 ? (baseType *)0 : \ 152*4e1bc9a0SAchim Leubner ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName))))) 153*4e1bc9a0SAchim Leubner 154*4e1bc9a0SAchim Leubner 155*4e1bc9a0SAchim Leubner 156*4e1bc9a0SAchim Leubner 157*4e1bc9a0SAchim Leubner #endif /* __SMLIST_H__ */ 158*4e1bc9a0SAchim Leubner 159*4e1bc9a0SAchim Leubner 160*4e1bc9a0SAchim Leubner 161