OpenRTMFP/Cumulus Primer(13)IO管理之區域性記憶體片

鍾超發表於2012-04-24

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

-

相關文章