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:
- 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数据区才会被释放。
父主题: 类型定义