mm1_core.c

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

C
486
字号
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/kernel/src/mm1_core.c</TITLE></HEAD><BODY><pre><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/*     Copyright (c) 1997-1999 Australian Real Time Embedded Systems     */</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/* PROPRIETARY RIGHTS of Australian Real Time Embedded Systems           */</font><font color="#6920ac">/* are involved in the subject matter of this material. All reproduction,*/</font><font color="#6920ac">/* manufacturing, use, and sales rights pertaining to this subject matter*/</font><font color="#6920ac">/* are governed by the license agreement. The recipient of this software */</font><font color="#6920ac">/* implicitly accepts the terms of the license.                          */</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/*************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="mm1_defs.h.FIND-INC"><font color="blue">"mm1_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="mm1_priv.h.FIND-INC"><font color="blue">"mm1_priv.h"</font></a><font size="+1"><i>crtx_Bool_t</i> <b><font color="azure1"><a name="mem1_Create">mem1_Create</a></font></b>(<i>crtx_Void_t</i> *Addr_a, <i>dmem_Size_t</i> Size_a,                        <i>crtx_Void_t</i> *pContext_a __attribute__((unused))){</font>    <i>mem1_SegmHead_t</i>  *sghead;    <i>mem1_FrgHead_t</i>  *frg;    <i>dmem_Size_t</i> minsize;        minsize = <i>sizeof</i>(<i>mem1_SegmHead_t</i>) + <i>sizeof</i>(<i>mem1_FrgHead_t</i>);    <font color="#6920ac">/* control minsize of a segment */</font>    <b>if</b> ((<i>dmem_Size_t</i>)minsize &gt;= Size_a)    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrSmallSegment_Exc;    }        <font color="#6920ac">/* check for segment address alignment */</font>    <b>if</b> (!(((<i>dmem_Size_t</i>)Addr_a &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) == 0))    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrWrongAlignment_Exc;    }    sghead = (<i>mem1_SegmHead_t</i> *)Addr_a;    frg = (<i>mem1_FrgHead_t</i> *)&amp;(((<i>crtx_Char_t</i> *)sghead)[        <i>sizeof</i>(<i>mem1_SegmHead_t</i>)]);        sghead-&gt;pFirst = frg;    sghead-&gt;sz = Size_a;    frg-&gt;pNext = <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>;    frg-&gt;sz = Size_a - minsize;    <a href="rrlc_Create.FIND-FUNC">rrlc_Create</a>(&amp;sghead-&gt;lock,<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>);    <b>return</b>(<a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>);<font color="blue">ErrSmallSegment_Exc:</font><font color="blue">ErrWrongAlignment_Exc:</font>    <b>return</b>(<a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>);}<font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="mem1_Free">mem1_Free</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                      <i>crtx_Void_t</i> *pContext_a __attribute__((unused)),                      <i>crtx_Void_t</i> *Addr_a,                      <i>dmem_Size_t</i> Size_a){</font>    <font color="#6920ac">/* address of linked segment ? */</font>    <i>mem1_SegmHead_t</i>  *sghead;    <i>mem1_FrgHead_t</i>  *frg,**lfrg;    <i>crtx_Char_t</i> *faddr; <font color="#6920ac">/* first address of deallocated fragment */</font>    <i>crtx_Char_t</i> *laddr; <font color="#6920ac">/* last address of deallocated segment */</font>    <i>crtx_Char_t</i> *fchad;    <i>crtx_Char_t</i> *lchad;<font color="#6920ac">/*  crtx_Int16_t notremove;*/</font>    <b>if</b> (Sgadd_a==<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrWrongAddrOrSize_Exc;    }    <b>if</b> (Size_a &lt; <i>sizeof</i>(<i>mem1_FrgHead_t</i>)) Size_a = <i>sizeof</i>(<i>mem1_FrgHead_t</i>);        Size_a += (<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>-(Size_a &amp;                               (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) )&amp;(~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>));        sghead = (<i>mem1_SegmHead_t</i> *)Sgadd_a;    <font color="#6920ac">/* check that deallocated fragment in this segment */</font>    fchad = &amp;((<i>crtx_Char_t</i> *)Sgadd_a)[<i>sizeof</i>(<i>mem1_SegmHead_t</i>)];    lchad = &amp;fchad[sghead-&gt;sz - <i>sizeof</i>(<i>mem1_SegmHead_t</i>)];    faddr = (<i>crtx_Char_t</i> *)Addr_a;    laddr = &amp;faddr[Size_a];        <font color="#6920ac">/* check address on minimum allign */</font>    <font color="#6920ac">/* check that removed piece in the segment */</font>    <b>if</b> ( ! ((faddr &gt;= fchad &amp;&amp; faddr &lt; lchad) &amp;&amp;            (laddr &gt; fchad &amp;&amp; laddr &lt;= lchad) &amp;&amp;            (laddr &gt;= &amp;faddr[<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>]) &amp;&amp;            (((<i>dmem_Size_t</i>)faddr &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) == 0)))    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrWrongAddrOrSize_Exc;    }    <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;sghead-&gt;lock);    <font color="#6920ac">/* check that removed segment in distributed space of memory */</font>        frg = sghead-&gt;pFirst;    <b>while</b> (frg != <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>) {        fchad = (<i>crtx_Char_t</i> *)frg;        lchad = &amp;fchad[frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)];        <b>if</b> (!((faddr &lt; fchad &amp;&amp; laddr &lt;= fchad) ||              (faddr &gt;=  lchad &amp;&amp; laddr &gt; lchad)))        {            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrIntersection_Exc;        }        frg = frg-&gt;pNext;    }        <font color="#6920ac">/* search for the end of chain */</font>        frg = sghead-&gt;pFirst;    lfrg = &amp;sghead-&gt;pFirst;        <font color="#6920ac">/* chain in the unsorted order */</font>        <b>while</b> (frg!=<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <b>if</b> ((<i>crtx_Char_t</i> *)frg == laddr)        {            <font color="#6920ac">/* concatenated fragment out off chain */</font>            laddr = &amp;((<i>crtx_Char_t</i> *)frg)[frg-&gt;sz +                                         <i>sizeof</i>(<i>mem1_FrgHead_t</i>)];            Size_a += frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>);            *lfrg = frg-&gt;pNext;            frg = frg-&gt;pNext;            <b>continue</b>;        }        <b>if</b> (&amp;((<i>crtx_Char_t</i> *)frg)[frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)] == faddr)        {            faddr = (<i>crtx_Char_t</i> *)frg;            Size_a += frg-&gt;sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>);            *lfrg = frg-&gt;pNext;            frg = frg-&gt;pNext;            <b>continue</b>;        }                   lfrg = &amp;frg-&gt;pNext;        frg = frg-&gt;pNext;    }       *lfrg = (<i>mem1_FrgHead_t</i> *)faddr;    (*lfrg)-&gt;pNext = <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>;    (*lfrg)-&gt;sz = Size_a - <i>sizeof</i>(<i>mem1_FrgHead_t</i>);    <font color="blue">ErrIntersection_Exc:</font><font color="#6920ac">/*printf("free1 clear\n");*/</font>    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;sghead-&gt;lock);<font color="blue">ErrWrongAddrOrSize_Exc:</font>    <b>return</b>;}<font size="+1"><i>static</i> <i>crtx_Void_t</i> * <b><font color="azure1"><a name="mem1_DoAlloc">mem1_DoAlloc</a></font></b>(<i>crtx_Void_t</i> *Sgadd_a,                                  <i>dmem_Size_t</i> Size_a,                                  <i>crtx_Uint16_t</i> Algn_a,                                  <i>crtx_Bool_t</i> Locate_a){</font>    <i>mem1_SegmHead_t</i>  *sghead;    <i>mem1_FrgHead_t</i>  *frg,**lfrg,*nfrg;    <i>dmem_Size_t</i> algndelt;    <i>crtx_Void_t</i>  *Result = <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>;        <font color="#6920ac">/* do not distribute less than sizeof(mem1_FrgHead_t) bytes */</font>        <b>if</b> (!(((-Algn_a)&amp;Algn_a)==Algn_a))    {        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrAlignment_Exc;    }        <b>if</b> (Algn_a &lt; <a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>)    {        Algn_a = <a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>;    }        <b>if</b> (Size_a &lt; <i>sizeof</i>(<i>mem1_FrgHead_t</i>)) Size_a = <i>sizeof</i>(<i>mem1_FrgHead_t</i>);        sghead = (<i>mem1_SegmHead_t</i> *)Sgadd_a;    Size_a += (<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>-(Size_a &amp; (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) ) &amp;        (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>));    <font color="#6920ac">/* lock a segment */</font>        <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;sghead-&gt;lock);        <font color="#6920ac">/* search fo the end of chain */</font>    frg = sghead-&gt;pFirst;        lfrg = &amp;sghead-&gt;pFirst;        <b>while</b> (frg!=<a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>)    {        <font color="#6920ac">/* check for correctnes of free fragment */</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> ErrBadFreeFagment_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> ErrBadFreeFagment_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> ErrBadFreeFagment_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> ErrBadFreeFagment_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> ErrBadFreeFagment_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> ErrBadFreeFagment_Exc;        }                algndelt = (((<i>dmem_Size_t</i>)Algn_a - (<i>dmem_Size_t</i>)frg) &amp;                    (~(-(<i>dmem_Size_t</i>)Algn_a)));                <b>if</b> (algndelt != 0 &amp;&amp; algndelt &lt; <i>sizeof</i>(<i>mem1_FrgHead_t</i>))        {            <font color="#6920ac">/* correct delt to put free piece header */</font>            algndelt+=Algn_a;        }        <b>if</b> (frg-&gt;sz &gt;= Size_a+algndelt )

⌨️ 快捷键说明

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