mm1_core.c

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

C
486
字号
        {            <font color="#6920ac">/* appropriate fragment found */</font>            <b>break</b>;        }        <b>if</b> ((((<i>dmem_Size_t</i>)frg &amp; (~(-(<i>dmem_Size_t</i>)Algn_a))) == 0) &amp;&amp;            (frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) == Size_a+algndelt))        {            <font color="#6920ac">/* appropriate fragment found */</font>            <b>break</b>;        }        lfrg = &amp;frg-&gt;pNext;        frg = frg-&gt;pNext;    }    <b>if</b> (frg != <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <b>if</b> ( Locate_a )        {            <font color="#6920ac">/* try to move block in low addresses */</font>            <b>if</b> (<i>sizeof</i>(<i>mem1_FrgHead_t</i>) + frg-&gt;sz &gt;= Size_a+algndelt+Algn_a)            {                algndelt += ((frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) -                              (Size_a+algndelt))/Algn_a)*Algn_a;                <b>if</b> ((frg-&gt;sz+<i>sizeof</i>(<i>mem1_FrgHead_t</i>) != Size_a+algndelt) &amp;&amp;                    (frg-&gt;sz &lt; Size_a+algndelt))                {                    algndelt-=Algn_a;                }                            }        }        <b>if</b> (frg-&gt;sz &lt; Size_a + algndelt)        {            <font color="#6920ac">/* all free fragment was taken, exclude it from chain */</font>            frg-&gt;sz -= Size_a + algndelt;            <b>if</b> (algndelt != 0)            {                frg-&gt;sz = algndelt - <i>sizeof</i>(<i>mem1_FrgHead_t</i>);            }            <b>else</b>            {                *lfrg = frg-&gt;pNext;            }        }        <b>else</b>        {            nfrg = (<i>mem1_FrgHead_t</i>  *)(                (<i>dmem_Size_t</i>)(&amp;((<i>crtx_Char_t</i> *)frg)[algndelt + Size_a]));            nfrg-&gt;sz = frg-&gt;sz - (algndelt + Size_a);            nfrg-&gt;pNext = frg-&gt;pNext;            frg-&gt;sz = algndelt - <i>sizeof</i>(<i>mem1_FrgHead_t</i>);            <b>if</b> (algndelt != 0)            {                frg-&gt;pNext = nfrg;            }            <b>else</b>            {                *lfrg = nfrg;            }        }        Result = (<i>crtx_Void_t</i> *)&amp;((<i>crtx_Char_t</i> *)frg)[frg-&gt;sz +                                                     <i>sizeof</i>(<i>mem1_FrgHead_t</i>)];    }    <font color="#6920ac">/* unlock a segment */</font><font color="#6920ac">/*printf("alloc1 clear\n");*/</font><font color="#6920ac">/*ErrFreeFragment:*/</font>    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);    <b>return</b>(Result);<font color="blue">ErrBadFreeFagment_Exc:</font>    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);<font color="blue">ErrAlignment_Exc:</font>    <b>return</b>(<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>);}<font size="+1"><i>crtx_Void_t</i> * <b><font color="azure1"><a name="mem1_Alloc">mem1_Alloc</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                         <i>crtx_Void_t</i> *pContext_a __attribute__((unused)),                         <i>dmem_Size_t</i> Size_a,                         <i>crtx_Uint16_t</i> Algn_a) {</font>    <b>return</b>(<a href="#mem1_DoAlloc">mem1_DoAlloc</a>(Sgadd_a, Size_a, Algn_a, <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>));}<font size="+1"><i>crtx_Void_t</i> * <b><font color="azure1"><a name="mem1_AllocSt">mem1_AllocSt</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                           <i>crtx_Void_t</i> *pContext_a __attribute__((unused)),                           <i>dmem_Size_t</i> Size_a,                           <i>crtx_Uint16_t</i> Algn_a) {</font>    <b>return</b>(<a href="#mem1_DoAlloc">mem1_DoAlloc</a>(Sgadd_a, Size_a, Algn_a, <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>));}<font color="#6920ac">/* returns pointer on input structure info if ok and DMEM_NULL otherwise */</font><font size="+1"><i>dmem_SegmInfo_t</i> * <b><font color="azure1"><a name="mem1_Info">mem1_Info</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                            <i>crtx_Void_t</i> *pContext_a __attribute__((unused)),                            <i>dmem_SegmInfo_t</i> *pInfo_a){</font>    <i>mem1_SegmHead_t</i>  *sghead;    <i>mem1_FrgHead_t</i>  *frg;    <i>dmem_Size_t</i> FrgSize;    <b>if</b> (pInfo_a == <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrInfoParam_Exc;    }        <a href="memset.FIND-FUNC">memset</a>(pInfo_a, 0, <i>sizeof</i>(<i>dmem_SegmInfo_t</i>));    sghead = ( <i>mem1_SegmHead_t</i> *)Sgadd_a;    <b>if</b> (!(((<i>dmem_Size_t</i>)sghead &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) == 0))    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrBadSegmAddr_Exc;    }    <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;sghead-&gt;lock);    pInfo_a-&gt;Size = sghead-&gt;sz - <i>sizeof</i>(<i>mem1_SegmHead_t</i>);    <font color="#6920ac">/* search fo the end of chain */</font>    frg = sghead-&gt;pFirst;        <b>while</b> (frg!=<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <font color="#6920ac">/* checking of free segment correctness */</font>        <b>if</b> (!(((<i>dmem_Size_t</i>)frg &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>)))==0))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg &gt;=              (<i>dmem_Size_t</i>)sghead +               <i>sizeof</i>(<i>mem1_SegmHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg &lt;=              (<i>dmem_Size_t</i>)sghead +              sghead-&gt;sz - <i>sizeof</i>(<i>mem1_FrgHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }                <b>if</b> (!((((<i>dmem_Size_t</i>)frg+frg-&gt;sz) &amp;               (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>)))==0))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg+frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)&gt;=               (<i>dmem_Size_t</i>)frg +              <i>sizeof</i>(<i>mem1_FrgHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg + frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) &lt;=              (<i>dmem_Size_t</i>)sghead + sghead-&gt;sz))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        FrgSize = frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>);        pInfo_a-&gt;Free += FrgSize;                <b>if</b> ( FrgSize &gt;= pInfo_a-&gt;Max)        {            pInfo_a-&gt;Max = FrgSize;        }        frg = frg-&gt;pNext;    }    pInfo_a-&gt;Used = pInfo_a-&gt;Size - pInfo_a-&gt;Free;    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);    <b>return</b>(pInfo_a);<font color="blue">ErrFreeFragment_Exc:</font><font color="#6920ac">/*ErrWrongParam_Exc:*/</font>    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);<font color="blue">ErrInfoParam_Exc:</font><font color="blue">ErrBadSegmAddr_Exc:</font>    <b>return</b>(<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>);}<font size="+1"><i>crtx_Bool_t</i> <b><font color="azure1"><a name="mem1_Check">mem1_Check</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                       <i>crtx_Void_t</i> *pContext_a __attribute__((unused)),                       <i>crtx_Void_t</i> * pAttr_a __attribute__((unused))) {</font>    <i>mem1_SegmHead_t</i>  *sghead;    <i>mem1_FrgHead_t</i>  *frg;    sghead = ( <i>mem1_SegmHead_t</i> *)Sgadd_a;    <b>if</b> (!(((<i>dmem_Size_t</i>)sghead &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) == 0))    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrBadSegmAddr_Exc;    }    <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;sghead-&gt;lock);    <font color="#6920ac">/* check chain of free fragments */</font>    frg = sghead-&gt;pFirst;        <b>while</b> (frg!=<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <font color="#6920ac">/* checking of free segment correctness */</font>        <b>if</b> (!(((<i>dmem_Size_t</i>)frg &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>)))==0))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg &gt;=              (<i>dmem_Size_t</i>)sghead +               <i>sizeof</i>(<i>mem1_SegmHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg &lt;=              (<i>dmem_Size_t</i>)sghead +               sghead-&gt;sz - <i>sizeof</i>(<i>mem1_FrgHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }                <b>if</b> (!((((<i>dmem_Size_t</i>)frg+frg-&gt;sz) &amp;               (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>)))==0))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg+frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) &gt;=               (<i>dmem_Size_t</i>)frg +              <i>sizeof</i>(<i>mem1_FrgHead_t</i>)))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        <b>if</b> (!((<i>dmem_Size_t</i>)frg + frg-&gt;sz  + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) &lt;=              (<i>dmem_Size_t</i>)sghead + sghead-&gt;sz))         {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrFreeFragment_Exc;        }        frg = frg-&gt;pNext;    }    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);    <b>return</b>(<a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>);<font color="blue">ErrFreeFragment_Exc:</font>    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);<font color="blue">ErrBadSegmAddr_Exc:</font>    <b>return</b>(<a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>);}</pre></BODY></HTML>

⌨️ 快捷键说明

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