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 >= 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 & (~(-<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> *)&(((<i>crtx_Char_t</i> *)sghead)[ <i>sizeof</i>(<i>mem1_SegmHead_t</i>)]); sghead->pFirst = frg; sghead->sz = Size_a; frg->pNext = <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>; frg->sz = Size_a - minsize; <a href="rrlc_Create.FIND-FUNC">rrlc_Create</a>(&sghead->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 < <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 & (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) )&(~(-<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 = &((<i>crtx_Char_t</i> *)Sgadd_a)[<i>sizeof</i>(<i>mem1_SegmHead_t</i>)]; lchad = &fchad[sghead->sz - <i>sizeof</i>(<i>mem1_SegmHead_t</i>)]; faddr = (<i>crtx_Char_t</i> *)Addr_a; laddr = &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 >= fchad && faddr < lchad) && (laddr > fchad && laddr <= lchad) && (laddr >= &faddr[<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>]) && (((<i>dmem_Size_t</i>)faddr & (~(-<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>(&sghead->lock); <font color="#6920ac">/* check that removed segment in distributed space of memory */</font> frg = sghead->pFirst; <b>while</b> (frg != <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>) { fchad = (<i>crtx_Char_t</i> *)frg; lchad = &fchad[frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)]; <b>if</b> (!((faddr < fchad && laddr <= fchad) || (faddr >= lchad && laddr > lchad))) { <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrIntersection_Exc; } frg = frg->pNext; } <font color="#6920ac">/* search for the end of chain */</font> frg = sghead->pFirst; lfrg = &sghead->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 = &((<i>crtx_Char_t</i> *)frg)[frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)]; Size_a += frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>); *lfrg = frg->pNext; frg = frg->pNext; <b>continue</b>; } <b>if</b> (&((<i>crtx_Char_t</i> *)frg)[frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>)] == faddr) { faddr = (<i>crtx_Char_t</i> *)frg; Size_a += frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>); *lfrg = frg->pNext; frg = frg->pNext; <b>continue</b>; } lfrg = &frg->pNext; frg = frg->pNext; } *lfrg = (<i>mem1_FrgHead_t</i> *)faddr; (*lfrg)->pNext = <a href="DMEM_NULL.FIND-DEF">DMEM_NULL</a>; (*lfrg)->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>(&sghead->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)&Algn_a)==Algn_a)) { <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrAlignment_Exc; } <b>if</b> (Algn_a < <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 < <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 & (~(-<a href="DMEM_MIN_ALIGN.FIND-DEF">DMEM_MIN_ALIGN</a>))) ) & (~(-<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>(&sghead->lock); <font color="#6920ac">/* search fo the end of chain */</font> frg = sghead->pFirst; lfrg = &sghead->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 & (~(-<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 >= (<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 <= (<i>dmem_Size_t</i>)sghead + sghead->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->sz) & (~(-<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->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) >= (<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->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) <= (<i>dmem_Size_t</i>)sghead + sghead->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) & (~(-(<i>dmem_Size_t</i>)Algn_a))); <b>if</b> (algndelt != 0 && algndelt < <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->sz >= Size_a+algndelt )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?