diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index da9090db2..599a3e32b 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -53,6 +53,8 @@ #include #include +using namespace std::literals; + typedef void(sync_ls_cb)(unsigned mode, uint64_t size, uint64_t time, const char* name); struct syncsendbuf { @@ -112,8 +114,12 @@ struct TransferLedger { uint64_t bytes_transferred; uint64_t bytes_expected; bool expect_multiple_files; - std::string last_progress_str; + private: + std::string last_progress_str; + std::chrono::steady_clock::time_point last_progress_time; + + public: TransferLedger() { Reset(); } @@ -128,12 +134,13 @@ struct TransferLedger { } void Reset() { - last_progress_str.clear(); start_time = std::chrono::steady_clock::now(); files_transferred = 0; files_skipped = 0; bytes_transferred = 0; bytes_expected = 0; + last_progress_str.clear(); + last_progress_time = {}; } std::string TransferRate() { @@ -153,6 +160,12 @@ struct TransferLedger { void ReportProgress(LinePrinter& lp, const std::string& file, uint64_t file_copied_bytes, uint64_t file_total_bytes) { + static constexpr auto kProgressReportInterval = 100ms; + + auto now = std::chrono::steady_clock::now(); + if (now < last_progress_time + kProgressReportInterval) { + return; + } char overall_percentage_str[5] = "?"; if (bytes_expected != 0 && bytes_transferred <= bytes_expected) { int overall_percentage = static_cast(bytes_transferred * 100 / bytes_expected); @@ -186,6 +199,7 @@ struct TransferLedger { if (output != last_progress_str) { lp.Print(output, LinePrinter::LineType::INFO); last_progress_str = std::move(output); + last_progress_time = now; } }