-
Notifications
You must be signed in to change notification settings - Fork 2
Utils_SharedBufferState
SweerItTer edited this page Feb 21, 2026
·
4 revisions
SharedBufferState 是 utilsCore 核心模块的关键结构体,提供跨线程共享的缓冲区状态管理,支持多种缓冲区类型(MMAP、DMA-BUF fd、DmaBufferPtr)。
- 管理缓冲区的生命周期
- 提供跨线程共享的缓冲区状态
- 支持多种缓冲区类型
- 缓冲区有效性标志管理
- 多线程间共享缓冲区
- 跨硬件模块的零拷贝数据传输
- Frame 数据的共享和传递
- MMAP 和 DMA-BUF 混合使用
- 依赖: DmaBuffer(DMA-BUF 创建)
- 被依赖: Frame, DmaBuffer, VisionPipeline 等上层模块
SharedBufferState 是共享缓冲区状态的封装结构体,提供:
- 三种缓冲区类型支持(MMAP、DMABUF_FD、DMABUF_OBJ)
- DMA-BUF fd 的生命周期管理
- 有效性标志管理(原子操作)
- 支持移动语义
- RAII: 自动管理资源生命周期
- 原子操作: 使用 atomic 保证线程安全
- 移动语义: 支持移动,禁止拷贝
缓冲区类型枚举,定义缓冲区的所有权类型。
enum class BufferBacking {
NONE, // 无缓冲区
MMAP, // 仅映射到用户态的指针,fd 归外部/驱动管理
DMABUF_FD, // 由本对象拥有的 dma-buf 裸 fd
DMABUF_OBJ // 由本对象拥有的 DmaBufferPtr(包含相关信息)
};BufferBacking backing = BufferBacking::NONE;说明: 缓冲区的所有权类型
int rawFd = -1; // 当 backing == DMABUF_FD说明: DMA-BUF 文件描述符,由 SharedBufferState 管理
DmaBufferPtr dmabuf_ptr = nullptr; // 当 backing == DMABUF_OBJ说明: DmaBuffer 智能指针,由 SharedBufferState 管理
void* start = nullptr; // 当 backing == MMAP说明: 映射到用户态的地址
size_t length = 0;说明: 缓冲区的字节长度
std::atomic<bool> valid{false};说明: 跨线程可读的有效性标志,使用原子操作保证线程安全
private:
SharedBufferState();参数说明: 无
返回值: 无
所有权归属: 创建一个无效的 SharedBufferState 对象
注意事项:
- 私有构造函数,只能由类内部使用
- 创建一个无效的 SharedBufferState 对象(valid = false)
- 用于内部实现,外部不应直接调用
SharedBufferState(int fd = -1, void* ptr = nullptr, size_t len = 0);参数说明:
-
fd(输入): DMA-BUF 文件描述符 -
ptr(输入): 映射地址 -
len(输入): 缓冲区长度
返回值: 无
所有权归属:
- 如果 ptr 不为空且 fd 为 -1,类型为 MMAP
- 如果 fd > 0 且 ptr 为空,类型为 DMABUF_FD,SharedBufferState 管理 fd
注意事项:
- 自动设置 backing 类型
- valid 初始化为 true
SharedBufferState(DmaBufferPtr dmabuf_ptr_ = nullptr, void* ptr = nullptr, size_t len = 0);参数说明:
-
dmabuf_ptr_(输入): DmaBuffer 智能指针 -
ptr(输入): 映射地址 -
len(输入): 缓冲区长度
返回值: 无
所有权归属:
- 如果 ptr 不为空且 dmabuf_ptr_ 为空,类型为 MMAP
- 如果 dmabuf_ptr_ 不为空且 ptr 为空,类型为 DMABUF_OBJ,SharedBufferState 管理 dmabuf_ptr
注意事项:
- 如果 len 为 0,自动从 dmabuf_ptr 获取长度
- 自动设置 backing 类型
- valid 初始化为 true
int dmabuf_fd();参数说明: 无
返回值:
- 成功: 返回 DMA-BUF 文件描述符
- 失败: 返回 -1
所有权归属:
- 返回的 fd 由 SharedBufferState 管理
- 不要手动关闭返回的 fd
注意事项:
- 如果 dmabuf_ptr 不为空,返回 dmabuf_ptr->fd()
- 否则返回 rawFd
- 线程安全
使用例程:
// 获取 fd
int dma_fd = shared_state->dmabuf_fd();
if (dma_fd >= 0) {
// 使用 fd 进行 RGA 处理
rga_process(dma_fd, width, height);
}~SharedBufferState();行为:
- 将 valid 置为 false(使用 std::memory_order_release)
- 根据 backing 类型释放对应资源:
- MMAP: 调用 munmap(start, length)
- DMABUF_FD: 调用 close(rawFd)
- DMABUF_OBJ: 调用 dmabuf_ptr.reset()
- 重置所有字段
SharedBufferState(SharedBufferState&&) = default;
SharedBufferState& operator=(SharedBufferState&&) = default;支持: 移动构造和移动赋值
禁止:
SharedBufferState(const SharedBufferState&) = delete;
SharedBufferState& operator=(const SharedBufferState&) = delete;说明: 禁止拷贝,只能移动
-
valid 标志: 使用
std::atomic<bool>保证线程安全 - fd 访问: 只读访问,不需要额外同步
-
跨线程传递: 使用
std::shared_ptr跨线程传递 - valid 检查: 使用前检查 valid.load()
- 原子操作: valid 标志是线程安全的
// 映射 DMA-BUF 到用户空间
void* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, 0);
// 创建 SharedBufferState(MMAP 类型)
auto shared_state = std::make_shared<SharedBufferState>(-1, ptr, size);
// 使用
if (shared_state->valid.load()) {
process_buffer(shared_state->start, shared_state->length);
}
// 析构时自动 munmap// 创建 SharedBufferState(DMABUF_FD 类型)
auto shared_state = std::make_shared<SharedBufferState>(dma_fd);
// 使用
if (shared_state->valid.load()) {
int fd = shared_state->dmabuf_fd();
rga_process(fd, width, height);
}
// 析构时自动 close(dma_fd)// 创建 DmaBuffer
auto dma_buffer = DmaBuffer::create(1920, 1080, DRM_FORMAT_NV12);
// 创建 SharedBufferState(DMABUF_OBJ 类型)
auto shared_state = std::make_shared<SharedBufferState>(dma_buffer);
// 使用
if (shared_state->valid.load()) {
int fd = shared_state->dmabuf_fd();
rga_process(fd, width, height);
}
// 析构时自动释放 dma_buffer// CameraController 创建 Frame
Frame frame(shared_state);
// 检查有效性
if (frame.sharedState(0) && frame.sharedState(0)->valid.load()) {
int fd = frame.dmabuf_fd(0);
rga_process(fd, width, height);
}
// Frame 析构时,shared_ptr 引用计数减少// 线程 1: 创建 SharedBufferState
auto shared_state = std::make_shared<SharedBufferState>(dma_fd);
// 传递给线程 2
std::thread t1([shared_state]() {
if (shared_state->valid.load()) {
int fd = shared_state->dmabuf_fd();
process_buffer(fd);
}
});
t1.join();- 三种类型: 支持 MMAP、DMABUF_FD、DMABUF_OBJ 三种类型
- 禁止拷贝: 只支持移动,禁止拷贝
- valid 标志: 使用前检查 valid.load()
- 资源管理: 析构时自动释放对应资源
- 线程安全: valid 标志使用原子操作
- 跨线程传递: 使用 std::shared_ptr 跨线程传递
- dmabuf_fd(): 根据 backing 类型返回对应的 fd
- RAII: 自动管理资源生命周期
- DmaBuffer - DMA-BUF 缓冲区
- Frame - 帧数据接口
- Utils 模块总览
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器