diff --git a/selfdrive/ui/replay/camera.cc b/selfdrive/ui/replay/camera.cc index 9bcc00583e..ab4f02e890 100644 --- a/selfdrive/ui/replay/camera.cc +++ b/selfdrive/ui/replay/camera.cc @@ -77,10 +77,16 @@ void CameraServer::pushFrame(CameraType type, FrameReader *fr, const cereal::Enc if (cam.width != fr->width || cam.height != fr->height) { cam.width = fr->width; cam.height = fr->height; - waitFinish(); + waitForSent(); startVipcServer(); } ++publishing_; cam.queue.push({fr, eidx}); } + +void CameraServer::waitForSent() { + while (publishing_ > 0) { + std::this_thread::yield(); + } +} diff --git a/selfdrive/ui/replay/camera.h b/selfdrive/ui/replay/camera.h index 9d72094d4c..753a059ce4 100644 --- a/selfdrive/ui/replay/camera.h +++ b/selfdrive/ui/replay/camera.h @@ -11,9 +11,7 @@ public: CameraServer(std::pair camera_size[MAX_CAMERAS] = nullptr, bool send_yuv = false); ~CameraServer(); void pushFrame(CameraType type, FrameReader* fr, const cereal::EncodeIndex::Reader& eidx); - inline void waitFinish() { - while (publishing_ > 0) usleep(0); - } + void waitForSent(); protected: struct Camera { diff --git a/selfdrive/ui/replay/replay.cc b/selfdrive/ui/replay/replay.cc index 1fdce6fd66..1b1e91a4a7 100644 --- a/selfdrive/ui/replay/replay.cc +++ b/selfdrive/ui/replay/replay.cc @@ -383,7 +383,7 @@ void Replay::stream() { publishMessage(evt); } else if (camera_server_) { if (hasFlag(REPLAY_FLAG_FULL_SPEED)) { - camera_server_->waitFinish(); + camera_server_->waitForSent(); } publishFrame(evt); } @@ -391,7 +391,7 @@ void Replay::stream() { } // wait for frame to be sent before unlock.(frameReader may be deleted after unlock) if (camera_server_) { - camera_server_->waitFinish(); + camera_server_->waitForSent(); } if (eit == events_->end() && !hasFlag(REPLAY_FLAG_NO_LOOP)) { diff --git a/selfdrive/ui/replay/util.cc b/selfdrive/ui/replay/util.cc index 5f06a6c834..f52e5efab0 100644 --- a/selfdrive/ui/replay/util.cc +++ b/selfdrive/ui/replay/util.cc @@ -305,7 +305,7 @@ void precise_nano_sleep(long sleep_ns) { // spin wait if (sleep_ns > 0) { while ((nanos_since_boot() - start_sleep) <= sleep_ns) { - usleep(0); + std::this_thread::yield(); } } }