replay: fix possible segfault in CameraServer (#22556)

pull/22570/head
Dean Lee 4 years ago committed by GitHub
parent 74a3c92704
commit 20b0ae0e65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      selfdrive/ui/replay/camera.cc
  2. 8
      selfdrive/ui/replay/camera.h

@ -60,5 +60,12 @@ void CameraServer::thread() {
} else { } else {
std::cout << "camera[" << type << "] failed to get frame:" << eidx.getSegmentId() << std::endl; std::cout << "camera[" << type << "] failed to get frame:" << eidx.getSegmentId() << std::endl;
} }
--publishing_;
} }
} }
void CameraServer::pushFrame(CameraType type, FrameReader *fr, const cereal::EncodeIndex::Reader &eidx) {
++publishing_;
queue_.push({type, fr, eidx});
}

@ -10,11 +10,9 @@ class CameraServer {
public: public:
CameraServer(); CameraServer();
~CameraServer(); ~CameraServer();
inline void pushFrame(CameraType type, FrameReader* fr, const cereal::EncodeIndex::Reader& eidx) { void pushFrame(CameraType type, FrameReader* fr, const cereal::EncodeIndex::Reader& eidx);
queue_.push({type, fr, eidx});
}
inline void waitFinish() { inline void waitFinish() {
while (!queue_.empty()) usleep(0); while (publishing_ > 0) usleep(0);
} }
protected: protected:
@ -33,6 +31,8 @@ protected:
{.rgb_type = VISION_STREAM_RGB_FRONT, .yuv_type = VISION_STREAM_YUV_FRONT}, {.rgb_type = VISION_STREAM_RGB_FRONT, .yuv_type = VISION_STREAM_YUV_FRONT},
{.rgb_type = VISION_STREAM_RGB_WIDE, .yuv_type = VISION_STREAM_YUV_WIDE}, {.rgb_type = VISION_STREAM_RGB_WIDE, .yuv_type = VISION_STREAM_YUV_WIDE},
}; };
std::atomic<int> publishing_ = 0;
std::thread camera_thread_; std::thread camera_thread_;
std::unique_ptr<VisionIpcServer> vipc_server_; std::unique_ptr<VisionIpcServer> vipc_server_;
SafeQueue<std::tuple<CameraType, FrameReader*, const cereal::EncodeIndex::Reader>> queue_; SafeQueue<std::tuple<CameraType, FrameReader*, const cereal::EncodeIndex::Reader>> queue_;

Loading…
Cancel
Save