⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib0042.html

📁 Memory Management—Algorithms and implementation in C/C++ Introduction Chapter 1 - Memory Manag
💻 HTML
📖 第 1 页 / 共 5 页
字号:
    <span style="background-color:d9d9d9">//more sanity checks</span>

    <span style="background-color:d9d9d9">if((COUNT(free)==FREE)   ||  //region if free</span>
       <span style="background-color:d9d9d9">(PREV(free)&gt;=free)    ||  //previous element not previous</span>
       <span style="background-color:d9d9d9">(NEXT(free)&gt;=size)    ||  //next is beyond the end</span>
       <span style="background-color:d9d9d9">(SIZE(free)&gt;=size)    ||  //size greater than whole</span>
       <span style="background-color:d9d9d9">(SIZE(free)==0))          //no size at all</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG0("checkIndex(): referencing invalid region\n");</span>
        <span style="background-color:d9d9d9">return (FALSE);</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">return (TRUE);</span>

<span style="background-color:d9d9d9">}/*end checkIndex-----------------------------------------------*/</span>

<span style="background-color:d9d9d9">void RefCountMemoryManager::inc(void *addr)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 free;    //index into ram[]</span>

    <span style="background-color:d9d9d9">if(checkAddress(addr)==FALSE){ return; }</span>

    <span style="background-color:d9d9d9">//translate void* addr to index in ram[]</span>

    <span style="background-color:d9d9d9">free = (U4)( ((U1*)addr) - &amp;ram[0] );</span>
    <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("inc(): address resolves to index %lu\n",free);</span>

    <span style="background-color:d9d9d9">if(checkIndex(free)==FALSE){ return; }</span>

    <span style="background-color:d9d9d9">COUNT(free) = COUNT(free)+1;</span>
    <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("inc(): incrementing ram[%lu] ",free);</span>
    <span style="background-color:d9d9d9">MSG1("to %lu\n",COUNT(free));</span>

    <span style="background-color:d9d9d9">return;</span><a name="558"></a><a name="IDX-296"></a>

<span style="background-color:d9d9d9">}/*end inc-----------------------------------------------*/</span>

<span style="background-color:d9d9d9">void RefCountMemoryManager::dec(void *addr)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 free;    //index into ram[]</span>

    <span style="background-color:d9d9d9">if(checkAddress(addr)==FALSE){ return; }</span>

    <span style="background-color:d9d9d9">//translate void* addr to index in ram[] </span>

    <span style="background-color:d9d9d9">free = (U4)( ((U1*)addr) - &amp;ram[0] );</span>

    <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("dec(): address resolves to index %lu\n",free);</span>

    <span style="background-color:d9d9d9">if(checkIndex(free)==FALSE){ return; }</span>

    <span style="background-color:d9d9d9">COUNT(free) = COUNT(free)-1;</span>
    <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
    <span style="background-color:d9d9d9">MSG1("dec(): decrementing ram[%lu] ",free);</span>
    <span style="background-color:d9d9d9">MSG1("to %lu\n",COUNT(free));</span>

    <span style="background-color:d9d9d9">if(COUNT(free)==FREE)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::");</span>
        <span style="background-color:d9d9d9">MSG1("dec(): releasing ram[%lu]\n",free);</span>
        <span style="background-color:d9d9d9">release(free); </span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">return;</span>

<span style="background-color:d9d9d9">}/*end dec---------------------------------------------------*/</span>

<span style="background-color:d9d9d9">void RefCountMemoryManager::release(U4 free)</span>
<span style="background-color:d9d9d9">{</span>
   <span style="background-color:d9d9d9">merge(PREV(free),free,NEXT(free));</span>

<span style="background-color:d9d9d9">#ifdef  DEBUG_RC_MEM_MGR</span>
    <span style="background-color:d9d9d9">printState();</span>
<span style="background-color:d9d9d9">#endif</span>
    <span style="background-color:d9d9d9">return;</span>

<span style="background-color:d9d9d9">}/*end release--&mdash;---&mdash;--&mdash;--&mdash;--&mdash;--&mdash;--&mdash;--&mdash;--&mdash;--&mdash;--&mdash;-------------*/</span>

<span style="background-color:d9d9d9">/*</span>
        <span style="background-color:d9d9d9">4 cases ( F=free O=occupied )</span>
            <span style="background-color:d9d9d9">FOF -&gt; [F]</span>
            <span style="background-color:d9d9d9">OOF -&gt; O[F]</span>
            <span style="background-color:d9d9d9">FOO -&gt; [F]0</span>
            <span style="background-color:d9d9d9">000 -&gt; OFO</span>
<span style="background-color:d9d9d9">*/</span><a name="559"></a><a name="IDX-297"></a>

<span style="background-color:d9d9d9">void RefCountMemoryManager::merge(U4 prev,U4 current,U4 next)</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">/*</span>
    <span style="background-color:d9d9d9">first handle special cases of region at end(s)</span>
    <span style="background-color:d9d9d9">prev=0                    low end</span>
    <span style="background-color:d9d9d9">next=0                    high end</span>
    <span style="background-color:d9d9d9">prev=0 and next=0        only 1 list element</span>
    <span style="background-color:d9d9d9">*/</span>

    <span style="background-color:d9d9d9">if (prev==0)</span>
    <span style="background-color:d9d9d9">{</span>
         <span style="background-color:d9d9d9">if(next==0)</span>
         <span style="background-color:d9d9d9">{</span>
             <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
         <span style="background-color:d9d9d9">}</span>
         <span style="background-color:d9d9d9">else if(COUNT(next)!=FREE)</span>
         <span style="background-color:d9d9d9">{</span>
             <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
         <span style="background-color:d9d9d9">}</span>
         <span style="background-color:d9d9d9">else if(COUNT(next)==FREE)</span>
         <span style="background-color:d9d9d9">{</span>
             <span style="background-color:d9d9d9">U4 temp;</span>

             <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::merge():");</span>
             <span style="background-color:d9d9d9">MSG0("merging to NEXT\n");</span>

             <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
             <span style="background-color:d9d9d9">SIZE(current)=SIZE(current)+SIZE(next)+SZ_HEADER;</span>
             <span style="background-color:d9d9d9">NEXT(current)=NEXT(next);</span>

             <span style="background-color:d9d9d9">temp = NEXT(next);</span>
             <span style="background-color:d9d9d9">if(temp!=0){ PREV(temp)=current; }</span>
         <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if(next==0)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">if(COUNT(prev)!=FREE)</span>
        <span style="background-color:d9d9d9">{</span>
            <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
        <span style="background-color:d9d9d9">}</span>
        <span style="background-color:d9d9d9">else if(COUNT(prev)==FREE)</span>
        <span style="background-color:d9d9d9">{</span>
            <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::merge():");</span>
            <span style="background-color:d9d9d9">MSG0("merging to PREV\n");</span>
            <span style="background-color:d9d9d9">SIZE(prev)=SIZE(prev)+SIZE(current)+SZ_HEADER;</span>
            <span style="background-color:d9d9d9">NEXT(prev)=NEXT(current);</span>
        <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">/* now we handle 4 cases */</span><a name="560"></a><a name="IDX-298"></a>
    <span style="background-color:d9d9d9">else if((COUNT(prev) !=FREE)&amp;&amp;(COUNT(next) !=FREE))</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if((COUNT(prev)!=FREE)&amp;&amp;(COUNT(next)==FREE))</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">U4 temp;</span>

        <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::merge():");</span>
        <span style="background-color:d9d9d9">MSG0("merging to NEXT\n");</span>
        <span style="background-color:d9d9d9">COUNT(current)=FREE;</span>
        <span style="background-color:d9d9d9">SIZE(current)=SIZE(current)+SIZE(next)+SZ_HEADER;</span>
        <span style="background-color:d9d9d9">NEXT(current)=NEXT(next);</span>

        <span style="background-color:d9d9d9">temp = NEXT(next);</span>
        <span style="background-color:d9d9d9">if(temp!=0){ PREV(temp)=current; }</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if((COUNT(prev)==FREE)&amp;&amp;(COUNT(next)!=FREE))</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::merge():");</span>
        <span style="background-color:d9d9d9">MSG0("merging to PREV\n");</span>
        <span style="background-color:d9d9d9">SIZE(prev)=SIZE(prev)+SIZE(current)+SZ_HEADER;</span>
        <span style="background-color:d9d9d9">NEXT(prev)=NEXT(current);</span>
        <span style="background-color:d9d9d9">PREV(next)=prev;</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">else if((COUNT(prev)==FREE)&amp;&amp;(COUNT(next)==FREE))</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">U4 temp;</span>

        <span style="background-color:d9d9d9">MSG0("RefCountMemoryManager::merge():");</span>
        <span style="background-color:d9d9d9">MSG0("merging with both sides\n");</span>
        <span style="background-color:d9d9d9">SIZE(prev)=SIZE(prev)+</span>
                   <span style="background-color:d9d9d9">SIZE(current)+SZ_HEADER+</span>
                   <span style="background-color:d9d9d9">SIZE(next)+SZ_HEADER;</span>
        <span style="background-color:d9d9d9">NEXT(prev)=NEXT(next);</span>

        <span style="background-color:d9d9d9">temp = NEXT(next);</span>
        <span style="background-color:d9d9d9">if(temp!=0){ PREV(temp)=prev; }</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">return;</span>

<span style="background-color:d9d9d9">}/*end merge -----------------------------------------------*/</span>

<span style="background-color:d9d9d9">void RefCountMemoryManager::printState()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">U4 i;</span>
    <span style="background-color:d9d9d9">U4 current;</span>

    <span style="background-color:d9d9d9">i=0;</span><a name="561"></a><a name="IDX-299"></a>
    <span style="background-color:d9d9d9">current=START;</span>

    <span style="background-color:d9d9d9">while(NEXT(current)!=0)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">printf("%lu) [P=%lu]",i,PREV(current));</span>
        <span style="background-color:d9d9d9">printf("[addr=%lu]",current);</span>
        <span style="background-color:d9d9d9">if(COUNT(current)==FREE){ printf("[FREE]"); }</span>
        <span style="background-color:d9d9d9">else{ printf("[Ct=%lu]",COUNT(current)); }</span>
        <span style="background-color:d9d9d9">printf("[Sz=%lu]",SIZE(current));</span>
        <span style="background-color:d9d9d9">printf("[N=%lu]\n",NEXT(current));</span>
        <span style="background-color:d9d9d9">current = NEXT(current);</span>
        <span style="background-color:d9d9d9">i++;</span>
    <span style="background-color:d9d9d9">}</span>

    <span style="background-color:d9d9d9">//print the last list element</span>

    <span style="background-color:d9d9d9">printf("%lu) [P=%lu]",i,PREV(current));</span>
    <span style="background-color:d9d9d9">printf("[addr=%lu]",current);</span>
    <span style="background-color:d9d9d9">if(COUNT(current)==FREE){ printf("[FREE]"); }</span>
    <span style="background-color:d9d9d9">else{ printf("[Ct=%lu]",COUNT(current)); }</span>
    <span style="background-color:d9d9d9">printf("[Sz=%lu]",SIZE(current));</span>
    <span style="background-color:d9d9d9">printf("[N=%lu]\n",NEXT(current));</span>

    <span style="background-color:d9d9d9">return;</span>

⌨️ 快捷键说明

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