Commit
e787ee2de53c1debfb7d70e0da1c7bfe7a124922
by lanxiaosongfix: 自动恢复重建 V4L2 流泄漏 pinned 内存,恢复加次数上限
- V4l2Stream 缓冲是 cudaHostAlloc 分配的 USERPTR,释放时却按 mmap 方式 munmap+free, 每次重建流(自动恢复)漏 4×4MB 锁页内存,进程 RSS 看不出来。改为 REQBUFS(0, USERPTR) 后 cudaFreeHost;InitUserp 重入、中途失败、析构时也释放。本机复现:旧方式每次重建系统可用 内存少 16.2MB,新方式 0。洋浦 VV067 10-19 左前 190 长期无图,恢复 1317 次把主机内存耗尽, 预测卡顿报 631310。 - 自动恢复:自上次出帧以来最多 10 次,用尽后停止复位(211 照报),相机重新出帧 30 帧后清零; senior_cam_recfg 不存在或不可执行时不再触发恢复(以前每次 system 返回 32512 仍重建流)。
|
 | src/camera/v4l2_stream.h |
 | src/camera/camera_driver_cuda.cpp |
 | src/camera/v4l2_stream.cpp |
 | src/camera/camera_driver_cuda.h |
Commit
c39a7865fe2059810968a2dbe3aad328f4bb67e8
by lanxiaosongfix: 相机流基类补虚析构,自动恢复用尽后改为退避重试
接 e787ee2(REVIEW-00050 审查意见): - IBaseCameraStream 没有虚析构,unique_ptr<IBaseCameraStream> 替换/释放时 ~V4l2Stream 不执行, V4L2 流重建失败(InitCapture 失败、is_init_success_=false)那条路径的 fd 和 pinned 缓冲仍会漏。 补 virtual ~IBaseCameraStream();重建失败后歇 1s 再重试,避免无间隔反复开关设备。 - 恢复次数用尽后不再永久停止:改为每 600s 试一次(链路恢复后要 recfg 重新配置解串器才能出图), 只打一次退避日志;相机出 30 帧后清零。 - senior_cam_recfg 不存在时只跳过本次(日志只打一次),补装后下次到阈值自动生效。
|
 | src/camera/camera_driver_cuda.h |
 | src/interface/base_camera_stream.h |
 | src/camera/camera_driver_cuda.cpp |
Commit
02a5ebf1bc7f7c080694b8ea58da40f6f5bf0c23
by lanxiaosongfix: V4L2 流重建持续失败时照样计无图、报 211、触发恢复
接 c39a786(REVIEW-00051):重建失败分支以前直接 return,不计无图次数、不调 TryAutoRecovery, recfg 后流起不来(STREAMON/QBUF 失败)时 211 不报、600s 退避重试也走不到,相机静默无图。 把读失败处理抽成 OnReadFail()(无图计数、满 50 停推流、满 150 报 211、无图计时、TryAutoRecovery), ReadBuffer 返回空和重建失败共用。
|
 | src/camera/camera_driver_cuda.h |
 | src/camera/camera_driver_cuda.cpp |
Commit
3b396841f5ae1fe8ae6c4cedccf64540e3a29142
by lanxiaosongfix: senior_cam_recfg 复位期间不重建/不读 V4L2 流
接 02a5ebf(REVIEW-00052):重建持续失败时触发的恢复,recfg 和 5s 等待期间采集线程仍每秒 open/S_FMT/STREAMON 一次设备,可能和 i2c 重配并发。恢复进行中且流待重建时,只计无图并歇 1s, 等恢复线程结束再重建一次。
|
 | src/camera/camera_driver_cuda.cpp |
Commit
c785145a2f2bd9dd64f5f449f94670dde6707894
by lanxiaosongfix: 自动恢复/重建/重试路径整体收口(并发、卡死、交接、重复初始化)
在 e787ee2~3b39684 基础上把「读失败→恢复→重建流」和「启动初始化失败→重试」两条路径整体梳理: - 恢复进行中采集线程一律不读、不重建设备,只计无图;恢复线程先置重建再清 is_recovering_。 - senior_cam_recfg 加 timeout 30s,i2c 卡住不会让恢复永远不结束。 - 析构先等恢复线程(它捕获了 this)。 - 重新暂停推流/触发恢复时复位 rtsp_reopen_handed_off_,修相机反复断开后 RTSP 永不重开。 - 启动初始化失败的相机:Init 完整成功后才置 is_init_flag_(改原子量),之前采集线程不碰设备 但照样计无图、可触发 recfg;Init 在恢复期间直接返回失败,开设备与触发复位用 device_mutex_ 互斥; ImageReader 只初始化一次,不再每秒重建 CUDA 资源。 - Init 不再同步 OpenWriter(NVENC 可能无限阻塞),writer 由推流线程首帧时打开,阻塞只影响推流。 - DQBUF 失败后歇 10ms,设备异常时不再空转刷日志。 - 重建流时清空指向旧缓冲的 current_image_buffer。
|
 | src/camera/camera_driver_cuda.h |
 | src/camera/camera_driver_cuda.cpp |
 | src/camera/v4l2_stream.cpp |