昇腾社区首页
中文
注册

OpenHiva::HivaBuffer类型定义

HivaBuffer是确定性调度框架特有的内存类型,用户可将数据拷贝到HivaBuffer,并调用消息发布Publish接口将HivaBuffer发布出去。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
namespace OpenHiva {
class HivaBuffer{
public:
    explicit HivaBuffer ();
    void ConstructFromMbuf(struct Mbuf *mbufPtr);           // 内部使用,构造HivaBuffer
    uint32_t GetBuff (void *&dataPtr, size_t &dataLen);    // 获取Buff数据区写入数据的起始地址和长度
    uint32_t SetBuffDataLen(const size_t dataLen);        // 设置已写入Buff数据区的数据长度
    uint32_t SetUserData (const UserData &data);          // 往UserData数据区写入数据
    uint32_t GetUserData (UserData &data);                // 获取UserData数据区的数据
    uint32_t CopyHivaBuffer(HivaBuffer &hivaBuffer);      // 拷贝HivaBuffer输出新对象newBuffer
    uint32_t FreeHivaBuffer();                            // HivaBuffer释放
private:
    Mbuf * mbufPtr_;
    friend HivaBuffPool;
    friend Publisher;
    friend BufferMessage;
};
}

其内存模型如图1

图1 HivaBuffer内存示意图
  • UserData类型定义如下:
    1
    2
    3
    struct OpenHiva::UserData {
          char[96] userData;   // 96bytes
    };
    

    用户可通过SetUserData接口设置HivaBuffer内的UserData数据,也可通过GetUserData获取HivaBuffer内的UserData数据。

  • Buffer使用注意事项:
    • 用户可通过GetBuff获取HivaBuffer内Buff数据区写入数据的起始地址和长度。
    • 用户可以通过往Buff数据区写入数据后再通过SetBuffDataLen设置已写入数据的长度。
    • 用户可以调用CopyHivaBuffer,输出新的HivaBuffer对象newBuffer。newBuffer与原HivaBuffer共享Buff数据区,此时Buff数据区的引用计数在原基础上加1;newBuffer与原HivaBuffer拥有各自的UserData数据区,newBuffer不会拷贝原HivaBuffer的UserData数据区。
    • Buff数据区可以在HivaBuffer之间共享,每多一个用户,Buff数据区引用计数加1;Buff数据区与HivaBuffer生命周期不同,当Buff数据区引用计数为0时,Buff数据区被释放。
    • UserData数据区不能在HivaBuffer之间共享,每个HivaBuffer都拥有各自的UserData数据区,UserData数据区与HivaBuffer生命周期相同。
    • 当用户需要释放HivaBuffer时,可调用FreeHivaBuffer接口,此接口会将HivaBuffer释放(包括UserData数据区),并将HivaBuffer所包含的Buff数据区引用计数减1,当引用计数为0时,Buff数据区才会被释放。