OpenRTMFP/Cumulus Primer(13)IO管理之區域性記憶體片
OpenRTMFP/Cumulus Primer(13)IO管理之區域性記憶體片
- Author: 柳大·Poechant(鍾超)
- Email: zhongchao.ustc#gmail.com (#->@)
- Blog:Blog.CSDN.net/Poechant
- Date: April 24th, 2012
首先要說的是,該類在 OpenRTMFP/Cumulus 中目前還沒有用到 :( 所以您可以關閉您瀏覽器當前標籤,以免浪費時間 :)
在《OpenRTMFP/Cumulus Primer(10)IO 管理之流緩衝區》一文中介紹的 MemoryStreamBuf 時,其中有一個名為 ScopedMemoryClip 的友元,它就是本文所要介紹的
首先,最重要的是,ScopedMemoryClip 中有一個 MemoryStreamBuf 成員。
class ScopedMemoryClip {
public:
ScopedMemoryClip(MemoryStreamBuf& buffer,Poco::UInt32 offset);
~ScopedMemoryClip();
private:
void clip(Poco::Int32 offset);
Poco::UInt32 _offset;
MemoryStreamBuf& _buffer;
};
1 建構函式
建構函式傳入的引數對應的就是 ScopedMemoryClip 的兩個成員值。其中偏移量不能超過 MemoryStremamBuf 的緩衝區上線值。
ScopedMemoryClip::ScopedMemoryClip(MemoryStreamBuf& buffer, UInt32 offset)
: _offset(offset), _buffer(buffer) {
if (_offset >= _buffer._bufferSize)
_offset = _buffer._bufferSize - 1;
if (_offset < 0)
_offset = 0;
clip(_offset);
}
2 解構函式
ScopedMemoryClip::~ScopedMemoryClip() {
clip(-(Int32)_offset);
}
3 緩衝區切割
可以看到建構函式和解構函式中都呼叫了 clip 函式,該函式切割完緩衝區,形成區域性記憶體片:
- 如果傳入的偏移量引數為正,則僅保留切割之後的後一部分。
- 如果傳入的引數為負,則相當於向前擴充緩衝區。(只發生於解構函式中)
其原始碼如下。
void ScopedMemoryClip::clip(Int32 offset) {
// 獲取到 gptr
char* gpos = _buffer.gCurrent();
// 偏移緩衝區地址,並修改緩衝區大小
_buffer._pBuffer += offset;
_buffer._bufferSize -= offset;
// pptr 的位置減去緩衝區新地址,作為 pptr 的新位置
int ppos = _buffer.pCurrent() - _buffer._pBuffer;
// 設定 gptr 可達區域和位置
_buffer.setg(_buffer._pBuffer, gpos, _buffer._pBuffer + _buffer._bufferSize);
// 設定 pptr 可達區域和位置
_buffer.setp(_buffer._pBuffer, _buffer._pBuffer + _buffer._bufferSize);
_buffer.pbump(ppos);
// 如果已寫資料數小於偏移量,則可以將已寫資料數設定為零
if (_buffer._written < offset)
_buffer._written = 0;
// 如果已寫資料數大於等於偏移量,則減去 offset
else
_buffer._written -= offset;
// 若已寫位元組數大於緩衝區容量,則設定為緩衝區容量
if (_buffer._written > _buffer._bufferSize)
_buffer._written = _buffer._bufferSize;
}
-
轉載請註明來自柳大的CSDN部落格:Blog.CSDN.net/Poechant
-
相關文章
- OpenRTMFP/Cumulus Primer(16)AMF解析之AMFReader
- OpenRTMFP/Cumulus Primer(14)AMF解析之PacketReader/Writer
- OpenRTMFP/Cumulus Primer(18)AMF解析之AMFReader(續2)
- OpenRTMFP/Cumulus Primer(17)AMF解析之AMFReader(續1)
- OpenRTMFP/Cumulus Primer(9)AMF解析之BinaryReader/Writer
- OpenRTMFP/Cumulus Primer(4)CumulusServer啟動流程分析Server
- OpenRTMFP/Cumulus Primer(15)AMF解析之資料型別定義資料型別
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續)Server
- OpenRTMFP/Cumulus Primer(8)CumulusServer主程式主迴圈分析Server
- OpenRTMFP/Cumulus Primer(6)CumulusServer啟動流程分析(續2)Server
- OpenRTMFP/Cumulus Primer(7)CumulusServer啟動流程分析(續3)Server
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續1)Server
- OpenRTMFP/Cumulus Primer(1)入門介紹與部署CumulusServerServer
- OpenRTMFP/Cumulus Primer(7)CumulusServer 啟動流程分析(續3)Server
- Java的記憶體管理機制之記憶體區域劃分Java記憶體
- OpenRTMFP/Cumulus Primer(9)AMF 處理方式解析——BinaryReader/Writer
- Java記憶體管理原理及記憶體區域詳解Java記憶體
- JVM之記憶體區域總結JVM記憶體
- OpenRTMFP/Cumulus Primer(2)用Lua編寫HelloWorld應用擴充套件CumulusServer套件Server
- JVM(二)-記憶體區域之執行緒私有區域JVM記憶體執行緒
- Java記憶體區域Java記憶體
- 【JVM記憶體區域】JVM記憶體
- JVM 記憶體區域JVM記憶體
- JVM記憶體區域JVM記憶體
- 深入理解JVM之記憶體區域與記憶體溢位JVM記憶體溢位
- Java記憶體區域和記憶體模型Java記憶體模型
- OpenRTMFP/Cumulus Primer(19)獨立使用CumulusLib時的執行緒安全Bug執行緒
- Java虛擬機器之記憶體區域Java虛擬機記憶體
- JVM的記憶體區域JVM記憶體
- RMAN的IO記憶體緩衝區記憶體
- 記憶體分配知識(全域性,區域性,靜態變數)記憶體變數
- Java記憶體區域(執行時資料區域)和記憶體模型(JMM)Java記憶體模型
- JVM 系列文章之 Java 的記憶體區域JVMJava記憶體
- jvm記憶體區域之虛擬機器棧JVM記憶體虛擬機
- jvm虛擬機器學習之記憶體區域介紹JVM虛擬機機器學習記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- JVM記憶體區域劃分JVM記憶體
- jvm 記憶體區域劃分JVM記憶體