📄 lib0039.html
字号:
<span style="background-color:d9d9d9">} /*end destructor---------------------------------------*/</span>
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">U4 nbytes - number of bytes required</span>
<span style="background-color:d9d9d9">returns address of first byte of memory region allocated</span>
<span style="background-color:d9d9d9">( or NULL if cannot allocate a large enough block )</span>
<span style="background-color:d9d9d9">*/</span><a name="519"></a><a name="IDX-270"></a>
<span style="background-color:d9d9d9">void* SegregatedMemoryManager::allocate(U4 nbytes)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 index;</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG1("allocate(%lu)\n",nbytes);</span>
<span style="background-color:d9d9d9">if(nbytes==0)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("allocate(): zero bytes requested\n");</span>
<span style="background-color:d9d9d9">return(NULL);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">if(nbytes<=16)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START16);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START32);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START64);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START128);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START256);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=32)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START32);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START64);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START128);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START256);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=64)</span><a name="520"></a><a name="IDX-271"></a>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START64);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START128);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START256);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=128)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START128);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START256);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=256)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START256);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=512)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START512);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=1024)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START1024);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span><a name="521"></a><a name="IDX-272"></a>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(nbytes<=4096)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">index = searchColumn(START4096);</span>
<span style="background-color:d9d9d9">if(index){ return((void*)&ram[index]); }</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">return(NULL);</span>
<span style="background-color:d9d9d9">}/*end allocation----------------------------------------------------*/</span>
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">search a given size range for a free element</span>
<span style="background-color:d9d9d9">return index</span>
<span style="background-color:d9d9d9">or zero if no available memory</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">U4 SegregatedMemoryManager::searchColumn(U4 index)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 i;</span>
<span style="background-color:d9d9d9">for(i=0;i<nrows;i++)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if(STATE(index)==FREE)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG1("searchColumn(): free at index %lu, ",index);</span>
<span style="background-color:d9d9d9">MSG1("address=%p\n",&ram[index]);</span>
<span style="background-color:d9d9d9">STATE(index)=OCCUPIED;</span>
<span style="background-color:d9d9d9">return(index);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">index = index + SZ_ROW;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">return(0);</span>
<span style="background-color:d9d9d9">}/*end searchColumn---------------------------------------------------*/</span>
<span style="background-color:d9d9d9">void SegregatedMemoryManager::release(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(addr==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("release(): cannot release NULL pointer\n");</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG1("release(%p)\n",addr);</span><a name="522"></a><a name="IDX-273"></a>
<span style="background-color:d9d9d9">//perform sanity check to make sure address is kosher</span>
<span style="background-color:d9d9d9">if( (addr>= (void*)&ram[size]) || (addr< (void*)&ram[0]) )</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("release(): address out of bounds\n");</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">//translate void* addr to index in ram[]</span>
<span style="background-color:d9d9d9">free = (U4)( ((U1*)addr) - &ram[0]);</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG1("address resolves to index %lu\n",free);</span>
<span style="background-color:d9d9d9">//a header always occupies first 13 bytes of storage</span>
<span style="background-color:d9d9d9">if(free==0)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</span>
<span style="background-color:d9d9d9">MSG0("release(): address in first 1st byte\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)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">MSG0("SegregatedMemoryManager::");</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">STATE(free)=FREE;</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end release---------------------------------------------------*/</span>
<span style="background-color:d9d9d9">void SegregatedMemoryManager::printState()</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">printf("[16 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START16);</span>
<span style="background-color:d9d9d9">printf("[32 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START32);</span>
<span style="background-color:d9d9d9">printf("[64 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START64);</span><a name="523"></a><a name="IDX-274"></a>
<span style="background-color:d9d9d9">printf("[128 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START128);</span>
<span style="background-color:d9d9d9">printf("[256 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START256);</span>
<span style="background-color:d9d9d9">printf("[512 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START512);</span>
<span style="background-color:d9d9d9">printf("[1024 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START1024);</span>
<span style="background-color:d9d9d9">printf("[4096 bytes]");</span>
<span style="background-color:d9d9d9">printColumn(START4096);</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end printState------------------------------------------------------*/</span>
<span style="background-color:d9d9d9">void SegregatedMemoryManager::printColumn(U4 index)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">U4 i;</span>
<span style="background-color:d9d9d9">for(i=0;i<nrows;i++)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if(STATE(index)==OCCUPIED)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">printf("[%p] ",&ram[index]);</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -