The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/pms/RefTisa/sallsdk/spc/sallist.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*******************************************************************************
    2 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
    3 *
    4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 
    5 *that the following conditions are met: 
    6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
    7 *following disclaimer. 
    8 *2. Redistributions in binary form must reproduce the above copyright notice, 
    9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
   10 *with the distribution. 
   11 *
   12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
   13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
   14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
   16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
   17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
   18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
   19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
   20 *
   21 * $FreeBSD$
   22 *
   23 ********************************************************************************/
   24 /*******************************************************************************/
   25 /*! \file sallist.h
   26  *  \brief The file contains link list manipulation helper routines
   27  *
   28  */
   29 /*******************************************************************************/
   30 
   31 #ifndef __SALLIST_H__
   32 #define __SALLIST_H__
   33 
   34 
   35 /********************************************************************
   36 *********************************************************************
   37 **   DATA STRUCTURES
   38 ********************************************************************/
   39 
   40 /** \brief Structure of Link Data
   41  *
   42  *  link data, need to be included at the start (offset 0)
   43  *  of any structures that are to be stored in the link list
   44  *
   45  */
   46 typedef struct _SALINK
   47 {
   48   struct _SALINK *pNext;
   49   struct _SALINK *pPrev;
   50 
   51   /*
   52   ** for assertion purpose only
   53   */
   54   struct _SALINK * pHead;     /* track the link list the link is a member of */
   55 
   56 } SALINK, * PSALINK;
   57 
   58 /** \brief Structure of Link List
   59  *
   60  * link list basic pointers
   61  *
   62  */
   63 typedef struct _SALINK_LIST
   64 {
   65   PSALINK pHead;
   66   bit32   Count;
   67 
   68   SALINK  Head; /* allways one link to speed up insert and delete */
   69 
   70 } SALINK_LIST, * PSALINK_LIST;
   71 
   72 
   73 /********************************************************************
   74 *********************************************************************
   75 ** MACROS
   76 ********************************************************************/
   77 
   78 /*! \def saLlistInitialize(pList)
   79 * \brief saLlistInitialize macro
   80 *
   81 * use to initialize a Link List
   82 */
   83 /*******************************************************************************
   84 ********************************************************************************
   85 **
   86 ** MODULE NAME: saLlistInitialize
   87 **
   88 ** PURPOSE:     Initialize a link list.
   89 **
   90 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
   91 **
   92 ** SIDE EFFECTS & CAVEATS:
   93 **
   94 ** ALGORITHM:
   95 **
   96 ********************************************************************************/
   97 /*lint -emacro(613,saLlistInitialize) */
   98 
   99 #define saLlistInitialize(pList) {(pList)->pHead        = &((pList)->Head); \
  100                                   (pList)->pHead->pNext = (pList)->pHead;   \
  101                                   (pList)->pHead->pPrev = (pList)->pHead;   \
  102                                   (pList)->Count        = 0;                \
  103                                  }
  104 
  105 #define saLlistIOInitialize(pList){(pList)->pHead        = &((pList)->Head); \
  106                                   (pList)->pHead->pNext = (pList)->pHead;   \
  107                                   (pList)->pHead->pPrev = (pList)->pHead;   \
  108                                   (pList)->Count        = 0;                \
  109                                  }
  110 /*! \def saLlinkInitialize(pLink)
  111 * \brief saLlinkInitialize macro
  112 *
  113 * use to initialize a Link
  114 */
  115 /********************************************************************************
  116 ********************************************************************************
  117 **
  118 ** MODULE NAME: saLlinkInitialize
  119 **
  120 ** PURPOSE:     Initialize a link.
  121 **              This function should be used to initialize a new link before it
  122 **              is used in the linked list. This will initialize the link so
  123 **              the assertion will work
  124 **
  125 ** PARAMETERS:  PSALINK      IN  - Link to be initialized.
  126 **
  127 ** SIDE EFFECTS & CAVEATS:
  128 **
  129 ** ALGORITHM:
  130 **
  131 ********************************************************************************
  132 *******************************************************************************/
  133 
  134 /*lint -emacro(613,saLlinkInitialize) */
  135 
  136 #define saLlinkInitialize(pLink) { (pLink)->pHead = agNULL;    \
  137                                    (pLink)->pNext = agNULL;    \
  138                                    (pLink)->pPrev = agNULL;    \
  139                                  }
  140 
  141 #define saLlinkIOInitialize(pLink) { (pLink)->pHead = agNULL;    \
  142                                    (pLink)->pNext = agNULL;    \
  143                                    (pLink)->pPrev = agNULL;    \
  144                                  }
  145 /*! \def saLlistAdd(pList, pLink)
  146 * \brief saLlistAdd macro
  147 *
  148 * use to add a link to the tail of list
  149 */
  150 /********************************************************************************
  151 ********************************************************************************
  152 **
  153 ** MODULE NAME: saLlistAdd
  154 **
  155 ** PURPOSE:     add a link at the tail of the list
  156 **
  157 ** PARAMETERS:  PSALINK_LIST OUT - Link list definition.
  158 **              PSALINK      IN  - Link to be inserted.
  159 **
  160 ** SIDE EFFECTS & CAVEATS:
  161 **   !!! assumes that fcllistInitialize has been called on the linklist
  162 **   !!! if not, this function behavior is un-predictable
  163 **
  164 **   The OS_ASSERT() is an assignment for debug code only
  165 **
  166 ** ALGORITHM:
  167 **
  168 ********************************************************************************
  169 *******************************************************************************/
  170 
  171 /*lint -emacro(506,saLlistAdd) */
  172 /*lint -emacro(613,saLlistAdd) */
  173 /*lint -emacro(666,saLlistAdd) */
  174 /*lint -emacro(720,saLlistAdd) */
  175 
  176 #define saLlistAdd(pList, pLink) {                                          \
  177                              (pLink)->pNext        = (pList)->pHead;        \
  178                              (pLink)->pPrev        = (pList)->pHead->pPrev; \
  179                              (pLink)->pPrev->pNext = (pLink);               \
  180                              (pList)->pHead->pPrev = (pLink);               \
  181                              (pList)->Count ++;                             \
  182                              (pLink)->pHead = (pList)->pHead;               \
  183                              }
  184 
  185 #define saLlistIOAdd(pList, pLink) {                                        \
  186                              (pLink)->pNext        = (pList)->pHead;        \
  187                              (pLink)->pPrev        = (pList)->pHead->pPrev; \
  188                              (pLink)->pPrev->pNext = (pLink);               \
  189                              (pList)->pHead->pPrev = (pLink);               \
  190                              (pList)->Count ++;                             \
  191                              (pLink)->pHead = (pList)->pHead;               \
  192                              }
  193 
  194 /*! \def saLlistInsert(pList, pLink, pNew)
  195 * \brief saLlistInsert macro
  196 *
  197 * use to insert a link preceding the given one
  198 */
  199 /********************************************************************************
  200 ********************************************************************************
  201 **
  202 ** MODULE NAME: saLlistInsert
  203 **
  204 ** PURPOSE:     insert a link preceding the given one
  205 **
  206 ** PARAMETERS:  PSALINK_LIST OUT - Link list definition.
  207 **              PSALINK      IN  - Link to be inserted after.
  208 **              PSALINK      IN  - Link to be inserted.
  209 **
  210 ** SIDE EFFECTS & CAVEATS:
  211 **   !!! assumes that fcllistInitialize has been called on the linklist
  212 **   !!! if not, this function behavior is un-predictable
  213 **
  214 **   The OS_ASSERT() is an assignment for debug code only
  215 **
  216 ** ALGORITHM:
  217 **
  218 ********************************************************************************
  219 *******************************************************************************/
  220 
  221 /*lint -emacro(506,saLlistInsert) */
  222 /*lint -emacro(613,saLlistInsert) */
  223 /*lint -emacro(666,saLlistInsert) */
  224 /*lint -emacro(720,saLlistInsert) */
  225 
  226 #define saLlistInsert(pList, pLink, pNew) {                                 \
  227                                  (pNew)->pNext        = (pLink);            \
  228                                  (pNew)->pPrev        = (pLink)->pPrev;     \
  229                                  (pNew)->pPrev->pNext = (pNew);             \
  230                                  (pLink)->pPrev       = (pNew);             \
  231                                  (pList)->Count ++;                         \
  232                                  (pNew)->pHead = (pList)->pHead;            \
  233                                  }
  234 
  235 /*! \def saLlistRemove(pList, pLink)
  236 * \brief saLlistRemove macro
  237 *
  238 * use to remove the link from the list
  239 */
  240 /********************************************************************************
  241 ********************************************************************************
  242 **
  243 ** MODULE NAME: saLlistRemove
  244 **
  245 ** PURPOSE:     remove the link from the list.
  246 **
  247 ** PARAMETERS:  PSALINK_LIST OUT  - Link list definition.
  248 **              PSALINK      IN   - Link to delet from list
  249 **
  250 ** SIDE EFFECTS & CAVEATS:
  251 **   !!! assumes that fcllistInitialize has been called on the linklist
  252 **   !!! if not, this function behavior is un-predictable
  253 **
  254 **   !!! No validation is made on the list or the validity of the link
  255 **   !!! the caller must make sure that the link is in the list
  256 **
  257 **
  258 ** ALGORITHM:
  259 **
  260 ********************************************************************************
  261 *******************************************************************************/
  262 
  263 /*lint -emacro(506,saLlistRemove) */
  264 /*lint -emacro(613,saLlistRemove) */
  265 /*lint -emacro(666,saLlistRemove) */
  266 /*lint -emacro(720,saLlistRemove) */
  267 
  268 #define saLlistRemove(pList, pLink) {                                   \
  269                            (pLink)->pPrev->pNext = (pLink)->pNext;      \
  270                            (pLink)->pNext->pPrev = (pLink)->pPrev;      \
  271                            (pLink)->pHead = agNULL;                     \
  272                            (pList)->Count --;                           \
  273                            }
  274 
  275 #define saLlistIORemove(pList, pLink) {                                 \
  276                            (pLink)->pPrev->pNext = (pLink)->pNext;      \
  277                            (pLink)->pNext->pPrev = (pLink)->pPrev;      \
  278                            (pLink)->pHead = agNULL;                     \
  279                            (pList)->Count --;                           \
  280                            }
  281 /*! \def saLlistGetHead(pList)
  282 * \brief saLlistGetHead macro
  283 *
  284 * use to get the link following the head link
  285 */
  286 /********************************************************************************
  287 ********************************************************************************
  288 **
  289 ** MODULE NAME: saLlistGetHead
  290 **
  291 ** PURPOSE:     get the link following the head link.
  292 **
  293 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
  294 **              RETURNS - PSALINK   the link following the head
  295 **                                  agNULL if the following link is the head
  296 **
  297 ** SIDE EFFECTS & CAVEATS:
  298 **   !!! assumes that fcllistInitialize has been called on the linklist
  299 **   !!! if not, this function behavior is un-predictable
  300 **
  301 ** ALGORITHM:
  302 **
  303 ********************************************************************************
  304 *******************************************************************************/
  305 #define saLlistGetHead(pList) saLlistGetNext(pList,(pList)->pHead)
  306 
  307 #define saLlistIOGetHead(pList) saLlistGetNext(pList,(pList)->pHead)
  308 
  309 /*! \def saLlistGetTail(pList)
  310 * \brief saLlistGetTail macro
  311 *
  312 * use to get the link preceding the tail link
  313 */
  314 /********************************************************************************
  315 ********************************************************************************
  316 **
  317 ** MODULE NAME: saLlistGetTail
  318 **
  319 ** PURPOSE:     get the link preceding the tail link.
  320 **
  321 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
  322 **              RETURNS - PSALINK   the link preceding the head
  323 **                                  agNULL if the preceding link is the head
  324 **
  325 ** SIDE EFFECTS & CAVEATS:
  326 **
  327 ** ALGORITHM:
  328 **
  329 ********************************************************************************
  330 *******************************************************************************/
  331 #define saLlistGetTail(pList) saLlistGetPrev((pList), (pList)->pHead)
  332 
  333 /*! \def saLlistGetCount(pList)
  334 * \brief saLlistGetCount macro
  335 *
  336 * use to get the number of links in the list excluding head and tail
  337 */
  338 /********************************************************************************
  339 ********************************************************************************
  340 **
  341 ** MODULE NAME: saLlistGetCount
  342 **
  343 ** PURPOSE:     get the number of links in the list excluding head and tail.
  344 **
  345 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
  346 **
  347 ** SIDE EFFECTS & CAVEATS:
  348 **   !!! assumes that fcllistInitialize has been called on the linklist
  349 **   !!! if not, this function behavior is un-predictable
  350 **
  351 ** ALGORITHM:
  352 **
  353 ********************************************************************************
  354 *******************************************************************************/
  355 
  356 /*lint -emacro(613,saLlistGetCount) */
  357 /*lint -emacro(666,saLlistGetCount) */
  358 
  359 #define saLlistGetCount(pList) ((pList)->Count)
  360 
  361 #define saLlistIOGetCount(pList) ((pList)->Count)
  362 
  363 /*! \def saLlistGetNext(pList, pLink)
  364 * \brief saLlistGetNext macro
  365 *
  366 * use to get the next link in the list
  367 */
  368 /********************************************************************************
  369 ********************************************************************************
  370 **
  371 ** MODULE NAME: saLlistGetNext
  372 **
  373 ** PURPOSE:     get the next link in the list. (one toward tail)
  374 **
  375 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
  376 **              PSALINK       IN  - Link to get next to
  377 **
  378 **           return PLINK  - points to next link
  379 **                           agNULL if next link is head
  380 **
  381 ** SIDE EFFECTS & CAVEATS:
  382 **   !!! assumes that fcllistInitialize has been called on the linklist
  383 **   !!! if not, this function behavior is un-predictable
  384 **
  385 **   !!! No validation is made on the list or the validity of the link
  386 **   !!! the caller must make sure that the link is in the list
  387 **
  388 ** ALGORITHM:
  389 **
  390 ********************************************************************************
  391 *******************************************************************************/
  392 
  393 /*lint -emacro(613,saLlistGetNext) */
  394 
  395 #define saLlistGetNext(pList, pLink) (((pLink)->pNext == (pList)->pHead) ?  \
  396                                       agNULL : (pLink)->pNext)
  397 
  398 #define saLlistIOGetNext(pList, pLink) (((pLink)->pNext == (pList)->pHead) ?  \
  399                                         agNULL : (pLink)->pNext)
  400 
  401 /*! \def saLlistGetPrev(pList, pLink)
  402 * \brief saLlistGetPrev macro
  403 *
  404 * use to get the previous link in the list
  405 */
  406 /********************************************************************************
  407 ********************************************************************************
  408 **
  409 ** MODULE NAME: saLlistGetPrev
  410 **
  411 ** PURPOSE:     get the previous link in the list. (one toward head)
  412 **
  413 ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
  414 **              PSALINK       IN  - Link to get prev to
  415 **
  416 **           return PLINK  - points to previous link
  417 **                           agNULL if previous link is head
  418 **
  419 ** SIDE EFFECTS & CAVEATS:
  420 **   !!! assumes that fcllistInitialize has been called on the linklist
  421 **   !!! if not, this function behavior is un-predictable
  422 **
  423 **   !!! No validation is made on the list or the validity of the link
  424 **   !!! the caller must make sure that the link is in the list
  425 **
  426 ** ALGORITHM:
  427 **
  428 ********************************************************************************
  429 *******************************************************************************/
  430 
  431 /*lint -emacro(613,saLlistGetPrev) */
  432 
  433 #define saLlistGetPrev(pList, pLink) (((pLink)->pPrev == (pList)->pHead) ?  \
  434                                       agNULL : (pLink)->pPrev)
  435 
  436 
  437 
  438 #define agObjectBase(baseType,fieldName,fieldPtr) \
  439             (void * ) fieldPtr == (void *) 0 ? (baseType *) 0 : \
  440             ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
  441 
  442 
  443 #endif /* #ifndef __SALLIST_H__*/

Cache object: 326eca6f000a73cbcff4f7e67917431b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.