ill_core.c

来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 1,267 行 · 第 1/4 页

C
1,267
字号
                  <i>sizeof</i>(<i>ilst_Pool_t</i>));    }    <b>else</b>    {        pPool_a-&gt;Flags    = <a href="ILST_FLAG_INIT.FIND-DEF">ILST_FLAG_INIT</a>; <font color="#6920ac">/* reset flags */</font>        pPool_a-&gt;pTable   = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;      <font color="#6920ac">/* no nodes */</font>        pPool_a-&gt;NrNodes  = 0;              <font color="#6920ac">/* no nodes */</font>        pPool_a-&gt;NrLists  = 0;              <font color="#6920ac">/* no lists */</font>        pPool_a-&gt;NextList = 0;              <font color="#6920ac">/* prevent list allocation */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>        <a href="CRTX_SET_NO_ID.FIND-DEF">CRTX_SET_NO_ID</a>(pPool_a);            <font color="#6920ac">/* no id */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    }    <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/************************************************************************** * * SERVICE NAME * *    ilst_AllocateList * * SYNOPSIS * *    #include "cortex.h" *    ilst_Pool_t   Pool; *    ilst_List_t   List;       -- preallocated list control block -- *    ilst_Key_t    MinKey; *    ilst_Key_t    MaxKey; *    ilst_AllocateList(&amp;Pool, &amp;List, MinKey, MaxKey, NULL); * *    #include "cortex.h" *    ilst_Pool_t   Pool; *    ilst_List_t   *pList;     -- dynamically allocated list control block -- *    crtx_Signed_t MinKey; *    crtx_Signed_t MaxKey; *    pList = ilst_AllocateList(&amp;Pool, NULL, MinKey, MaxKey, NULL); * * DESCRIPTION * *    Allocate index linked list from specified lists pool. * * ARGUMENTS * *    o Pointer to the pool control block index list is allocated from; *    o Pointer to index linked list control block (if NULL than *      list control block will be allocated); *    o Minimum key value; *    o Maximum key value; * * RETURN VALUE * *    o Pointer to index linked list control block; *    o NULL if memory allocation error detected or all available *      lists have been allocated; * * USAGE * *    o Used by CORTEX to create internal control structures; *    o Application level; * * CONSTRAINS * *    o Does not provide multi-thread access protection; *    o Lists Pool must be previously created by ilst_CreatePool(); * * AUTOR * *    Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS *      VA                  28-Jan-1997             Created initial version * **************************************************************************/</font><font size="+1"><i>ilst_List_t</i> *<b><font color="azure1"><a name="ilst_AllocateList">ilst_AllocateList</a></font></b>(    <i>ilst_Pool_t</i>     *pPool_a,           <font color="#6920ac">/* lists pool */</font>    <i>ilst_List_t</i>     *pList_a,           <font color="#6920ac">/* list control block */</font>    <i>ilst_Key_t</i>      MinKey_a,           <font color="#6920ac">/* min key value */</font>    <i>ilst_Key_t</i>      MaxKey_a            <font color="#6920ac">/* max key value */</font>){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <i>ilst_Node_t</i>     *pHead;    <i>ilst_Node_t</i>     *pTail;    <i>ilst_Index_t</i>    ListIndex;    <i>ilst_Index_t</i>    HeadIndex;    <i>ilst_Index_t</i>    TailIndex;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <font color="#6920ac">/* Validate Arguments */</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pPool_a)<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="ILST_CHECK_POOL_ID.FIND-DEF">ILST_CHECK_POOL_ID</a>(pPool_a))<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(MinKey_a &lt; MaxKey_a)    <b>if</b> (pPool_a-&gt;NextList &gt;= pPool_a-&gt;NrLists)        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> TooMany_Exc;         <font color="#6920ac">/* no free lists left */</font>    <font color="#6920ac">/* Prepare list control block */</font>    <b>if</b> (pList_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)    {        <font color="#6920ac">/* allocate pool control block */</font>        pList_a = (<i>ilst_List_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(pPool_a-&gt;Attr.Segment,                                           <i>sizeof</i>(<i>ilst_List_t</i>),                                           <i>sizeof</i>(<i>crtx_Unsigned_t</i>));        <b>if</b> ((<i>crtx_Void_t</i>*)pList_a == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>)        {   <font color="#6920ac">/* memory allocation error */</font>            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MemAllocError_Exc;        }        <font color="#6920ac">/* mark as internally allocated list control block */</font>        pList_a-&gt;Flags = <a href="ILST_FLAG_INIT.FIND-DEF">ILST_FLAG_INIT</a> | <a href="ILST_FLAG_LIST_ALLOC.FIND-DEF">ILST_FLAG_LIST_ALLOC</a>;    }    <b>else</b>    {        <font color="#6920ac">/* mark as externally allocated list control block */</font>        pList_a-&gt;Flags = <a href="ILST_FLAG_INIT.FIND-DEF">ILST_FLAG_INIT</a>;    }    ListIndex = pPool_a-&gt;NrNodes + (2 * pPool_a-&gt;NextList++);    HeadIndex = ListIndex++;    TailIndex = ListIndex;    pHead     = pPool_a-&gt;pTable+HeadIndex;    pTail     = pPool_a-&gt;pTable+TailIndex;    <font color="#6920ac">/* init head node */</font>    pHead-&gt;Next = TailIndex;    pHead-&gt;Prev = <a href="ILST_INDEX_NODE_EMPTY.FIND-DEF">ILST_INDEX_NODE_EMPTY</a>;    pHead-&gt;Key  = MinKey_a;    <font color="#6920ac">/* init tail node */</font>    pTail-&gt;Next = <a href="ILST_INDEX_NODE_EMPTY.FIND-DEF">ILST_INDEX_NODE_EMPTY</a>;    pTail-&gt;Prev = HeadIndex;    pTail-&gt;Key  = MaxKey_a;    <font color="#6920ac">/* init list control block */</font>    pList_a-&gt;pPool   = pPool_a;    pList_a-&gt;pTable  = pPool_a-&gt;pTable;    pList_a-&gt;Index   = HeadIndex;<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>    <a href="ILST_SET_LIST_ID.FIND-DEF">ILST_SET_LIST_ID</a>(pList_a);    pList_a-&gt;NrNodes = pPool_a-&gt;NrNodes;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    <b>return</b> pList_a;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">MemAllocError_Exc:</font>  <font color="#6920ac">/* memory allocation error exception */</font><font color="blue">TooMany_Exc:</font>        <font color="#6920ac">/* all avaiable lists have been allocated */</font>    <b>return</b> <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;}<font color="#6920ac">/************************************************************************** * * SERVICE NAME * *    ilst_FreeList * * SYNOPSIS * *    #include "cortex.h" *    ilst_Pool_t   Pool; *    ilst_List_t   *pList;     -- dynamically allocated list control block -- *    crtx_Signed_t MinKey; *    crtx_Signed_t MaxKey; *    pList = ilst_AllocateList(&amp;Pool, NULL, MinKey, MaxKey, NULL); *    ... *    ilst_FreeList(pList); * * DESCRIPTION * *    Free  ILL list, This procedure only release list control block's *    memory. Allociated list node are not freed and not available for  *    for future allocations. * * ARGUMENTS * *    o Pointer to index linked list control block * * RETURN VALUE * *    None  * * USAGE * *    o Used by CORTEX to create internal control structures; *    o Application level; * * CONSTRAINS * *    o Does not provide multi-thread access protection; *    o Lists Pool must be previously created by ilst_CreatePool(); * * AUTOR * *    Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS *      VA                  28-Jan-1997             Created initial version * **************************************************************************/</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="ilst_FreeList">ilst_FreeList</a></font></b>(    <i>ilst_List_t</i>     *pList_a            <font color="#6920ac">/* list control block */</font>){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <font color="#6920ac">/* Validate Arguments */</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pList_a)<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="ILST_CHECK_LIST_ID.FIND-DEF">ILST_CHECK_LIST_ID</a>(pList_a))<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    <b>if</b> (pList_a-&gt;Flags &amp; <a href="ILST_FLAG_LIST_ALLOC.FIND-DEF">ILST_FLAG_LIST_ALLOC</a>)    {        <font color="#6920ac">/* release internaly allocated list control block */</font>        <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pList_a-&gt;pPool-&gt;Attr.Segment, (<i>crtx_Void_t</i>*)pList_a,                  <i>sizeof</i>(<i>ilst_List_t</i>));    }    <b>else</b>    {        pList_a-&gt;Index  = <a href="ILST_INVALID_INDEX.FIND-DEF">ILST_INVALID_INDEX</a>;        pList_a-&gt;pTable = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;    <font color="#6920ac">/* no node table */</font>        pList_a-&gt;pPool  = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;    <font color="#6920ac">/* no pool */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>        <a href="CRTX_SET_NO_ID.FIND-DEF">CRTX_SET_NO_ID</a>(pList_a);        <font color="#6920ac">/* no id */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    }    <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/************************************************************************** * * SERVICE NAME * *    ilst_IsEmpty * * SYNOPSIS * *    #include "cortex.h" *    crtx_Boolean Result; *    list_List_t  List; * *    Result = iist_IsEmpty(&amp;List); * * DESCRIPTION * *    Test whether an index linked list is empty or not. * * ARGUMENTS * *    o Pointer to index linked list control block; * * RETURN VALUE * *    TRUE  - the specified list is empty *    FALSE - the specified list is not empty * * USAGE * *    o Used by CORTEX to handle internal control structures; *    o Application level; * * CONSTRAINS * *    o Does not provide multi-thread access protection; *    o List must be previously allocated by ilst_AllocateList * * AUTOR * *    Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS *      VA                  30-Jan-1997             Created initial version * **************************************************************************/</font><font size="+1"><i>crtx_Boolean_t</i> <b><font color="azure1"><a name="ilst_IsEmpty">ilst_IsEmpty</a></font></b>(

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?