diff --git a/selfdrive/ui/replay/logreader.cc b/selfdrive/ui/replay/logreader.cc index 8e2836a4ff755e..d836ef11f87301 100644 --- a/selfdrive/ui/replay/logreader.cc +++ b/selfdrive/ui/replay/logreader.cc @@ -56,15 +56,17 @@ bool LogReader::load(const std::string &url, std::atomic *abort, bool loca } bool LogReader::load(const std::byte *data, size_t size, std::atomic *abort) { - raw_ = decompressBZ2(data, size); + raw_ = decompressBZ2(data, size, abort); if (raw_.empty()) { - std::cout << "failed to decompress log" << std::endl; + if (!(abort && *abort)) { + std::cout << "failed to decompress log" << std::endl; + } return false; } try { kj::ArrayPtr words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); - while (words.size() > 0) { + while (words.size() > 0 && !(abort && *abort)) { #ifdef HAS_MEMORY_RESOURCE Event *evt = new (mbr_) Event(words); @@ -91,11 +93,14 @@ bool LogReader::load(const std::byte *data, size_t size, std::atomic *abor } } catch (const kj::Exception &e) { std::cout << "failed to parse log : " << e.getDescription().cStr() << std::endl; - if (events.empty()) return false; - - std::cout << "read " << events.size() << " events from corrupt log" << std::endl; + if (!events.empty()) { + std::cout << "read " << events.size() << " events from corrupt log" << std::endl; + } } - std::sort(events.begin(), events.end(), Event::lessThan()); - return true; + if (!events.empty() && !(abort && *abort)) { + std::sort(events.begin(), events.end(), Event::lessThan()); + return true; + } + return false; } diff --git a/selfdrive/ui/replay/util.cc b/selfdrive/ui/replay/util.cc index 97e824ea29c165..f1c41fcba0f88c 100644 --- a/selfdrive/ui/replay/util.cc +++ b/selfdrive/ui/replay/util.cc @@ -192,11 +192,11 @@ bool httpDownload(const std::string &url, const std::string &file, size_t chunk_ return httpDownload(url, of, chunk_size, size, abort); } -std::string decompressBZ2(const std::string &in) { - return decompressBZ2((std::byte *)in.data(), in.size()); +std::string decompressBZ2(const std::string &in, std::atomic *abort) { + return decompressBZ2((std::byte *)in.data(), in.size(), abort); } -std::string decompressBZ2(const std::byte *in, size_t in_size) { +std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic *abort) { if (in_size == 0) return {}; bz_stream strm = {}; @@ -222,10 +222,10 @@ std::string decompressBZ2(const std::byte *in, size_t in_size) { if (bzerror == BZ_OK && strm.avail_in > 0 && strm.avail_out == 0) { out.resize(out.size() * 2); } - } while (bzerror == BZ_OK); + } while (bzerror == BZ_OK && !(abort && *abort)); BZ2_bzDecompressEnd(&strm); - if (bzerror == BZ_STREAM_END) { + if (bzerror == BZ_STREAM_END && !(abort && *abort)) { out.resize(strm.total_out_lo32); return out; } diff --git a/selfdrive/ui/replay/util.h b/selfdrive/ui/replay/util.h index 726e65cb9430a3..1a09f2e971346f 100644 --- a/selfdrive/ui/replay/util.h +++ b/selfdrive/ui/replay/util.h @@ -5,8 +5,8 @@ std::string sha256(const std::string &str); void precise_nano_sleep(long sleep_ns); -std::string decompressBZ2(const std::string &in); -std::string decompressBZ2(const std::byte *in, size_t in_size); +std::string decompressBZ2(const std::string &in, std::atomic *abort = nullptr); +std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic *abort = nullptr); void enableHttpLogging(bool enable); std::string getUrlWithoutQuery(const std::string &url); size_t getRemoteFileSize(const std::string &url);