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 & (~(-(<i>dmem_Size_t</i>)Algn_a))) == 0) && (frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) == Size_a+algndelt)) { <font color="#6920ac">/* appropriate fragment found */</font> <b>break</b>; } lfrg = &frg->pNext; frg = frg->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->sz >= Size_a+algndelt+Algn_a) { algndelt += ((frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>) - (Size_a+algndelt))/Algn_a)*Algn_a; <b>if</b> ((frg->sz+<i>sizeof</i>(<i>mem1_FrgHead_t</i>) != Size_a+algndelt) && (frg->sz < Size_a+algndelt)) { algndelt-=Algn_a; } } } <b>if</b> (frg->sz < Size_a + algndelt) { <font color="#6920ac">/* all free fragment was taken, exclude it from chain */</font> frg->sz -= Size_a + algndelt; <b>if</b> (algndelt != 0) { frg->sz = algndelt - <i>sizeof</i>(<i>mem1_FrgHead_t</i>); } <b>else</b> { *lfrg = frg->pNext; } } <b>else</b> { nfrg = (<i>mem1_FrgHead_t</i> *)( (<i>dmem_Size_t</i>)(&((<i>crtx_Char_t</i> *)frg)[algndelt + Size_a])); nfrg->sz = frg->sz - (algndelt + Size_a); nfrg->pNext = frg->pNext; frg->sz = algndelt - <i>sizeof</i>(<i>mem1_FrgHead_t</i>); <b>if</b> (algndelt != 0) { frg->pNext = nfrg; } <b>else</b> { *lfrg = nfrg; } } Result = (<i>crtx_Void_t</i> *)&((<i>crtx_Char_t</i> *)frg)[frg->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>(&sghead->lock); <b>return</b>(Result);<font color="blue">ErrBadFreeFagment_Exc:</font> <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&sghead->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 & (~(-<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>(&sghead->lock); pInfo_a->Size = sghead->sz - <i>sizeof</i>(<i>mem1_SegmHead_t</i>); <font color="#6920ac">/* search fo the end of chain */</font> frg = sghead->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 & (~(-<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 >= (<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 <= (<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> ErrFreeFragment_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> ErrFreeFragment_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> ErrFreeFragment_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> ErrFreeFragment_Exc; } FrgSize = frg->sz + <i>sizeof</i>(<i>mem1_FrgHead_t</i>); pInfo_a->Free += FrgSize; <b>if</b> ( FrgSize >= pInfo_a->Max) { pInfo_a->Max = FrgSize; } frg = frg->pNext; } pInfo_a->Used = pInfo_a->Size - pInfo_a->Free; <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&sghead->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>(&sghead->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 & (~(-<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>(&sghead->lock); <font color="#6920ac">/* check chain of free fragments */</font> frg = sghead->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 & (~(-<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 >= (<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 <= (<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> ErrFreeFragment_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> ErrFreeFragment_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> ErrFreeFragment_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> ErrFreeFragment_Exc; } frg = frg->pNext; } <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&sghead->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>(&sghead->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 + -
显示快捷键?