欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片

程序员文章站 2022-03-02 18:12:43
...

OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片

  • Author: 柳大·Poechant(钟超)
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Blog: Blog.****.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;
}

-

转载请注明来自柳大的****博客:Blog.****.net/Poechant

-

相关标签: OpenRTMFP/Cumulus