📄 lib0038.html
字号:
<span style="background-color:d9d9d9">//a header always occupies first 13 bytes of storage</span>
<span style="background-color:d9d9d9">if (free<13)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("release(): address in first 13 bytes\n");</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">//yet more sanity checks</span>
<span style="background-color:d9d9d9">if((STATE(free)!=OCCUPIED) || //region if free</span><a name="498"></a><a name="IDX-257"></a>
<span style="background-color:d9d9d9">(PREV(free)>=free) || //previous element not previous</span>
<span style="background-color:d9d9d9">(NEXT(free)>=size) || //next is beyond the end</span>
<span style="background-color:d9d9d9">(SIZE(free)>=size) || //size region 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("SequentialFitMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("release(): referencing invalid region\n");</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">merge(PREV(free),free,NEXT(free));</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end release---------------------------------------------*/</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 -> [F]</span>
<span style="background-color:d9d9d9">OOF -> O[F]</span>
<span style="background-color:d9d9d9">FOO -> [F]O</span>
<span style="background-color:d9d9d9">OOO -> OFO</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">void SequentialFitMemoryManager::merge(U4 prev,U4 current,U4</span>
<span style="background-color:d9d9d9">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">STATE(current)=FREE;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(STATE(next)==OCCUPIED)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">STATE(current)=FREE;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(STATE(next)==FREE)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 temp;</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::merge():");</span>
<span style="background-color:d9d9d9">MSG0("merging to NEXT\n");</span><a name="499"></a><a name="IDX-258"></a>
<span style="background-color:d9d9d9">STATE(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">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(STATE(prev)==OCCUPIED)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">STATE(current)=FREE;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(STATE(prev)==FREE)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::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>
<span style="background-color:d9d9d9">else if((STATE(prev)==OCCUPIED)&&(STATE(next)==OCCUPIED))</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">STATE(current)=FREE;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if((STATE(prev)==OCCUPIED)&&(STATE(next)==FREE))</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 temp;</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::merge():");</span>
<span style="background-color:d9d9d9">MSG0("merging to NEXT\n");</span>
<span style="background-color:d9d9d9">STATE(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((STATE(prev)==FREE)&&(STATE(next)==OCCUPIED))</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::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((STATE(prev)==FREE)&&(STATE(next)==FREE))</span><a name="500"></a><a name="IDX-259"></a>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 temp;</span>
<span style="background-color:d9d9d9">MSG0("SequentialFitMemoryManager::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 SequentialFitMemoryManager::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>
<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">printf("[St=%s]",stateStr[STATE(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">printf("[St=%s]",stateStr[STATE(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>
<span style="background-color:d9d9d9">}/*end printState---------------------------------------------------------------*/</span><a name="501"></a><a name="IDX-260"></a>
</pre>
</div>
<a></a>
</div>
<div class="section">
<h4 class="sect4-title">mallocV2.cpp</h4>
<p class="first-para">There were several minor alterations to this file, most notably the presence of a different set of debugging macros. To activate debugging code, uncomment the macros and compile a new build.</p>
<div class="informalexample">
<pre class="literallayout">
<span style="background-color:d9d9d9">#include<stdio.h></span>
<span style="background-color:d9d9d9">#include<stdlib.h></span>
<span style="background-color:d9d9d9">#include<windows.h></span>
<span style="background-color:d9d9d9">#define DEBUG_SF_MEM_MGR</span>
<span style="background-color:d9d9d9">#define DEBUG_MALLOCV2</span>
<span style="background-color:d9d9d9">#include<memmgr.cpp></span>
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">wrapper functions</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">SequentialFitMemoryManager *mmptr;</span>
<span style="background-color:d9d9d9">void initMemMgr(unsigned long totalbytes)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">mmptr = new SequentialFitMemoryManager(totalbytes);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">void closeMemMgr()</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">delete(mmptr);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">void *newMalloc(unsigned long size)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">void *ptr = (*mmptr).allocate(size);</span>
<span style="background-color:d9d9d9">#ifdef DEBUG_MALLOCV2</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -