// Copyright Epic Games, Inc. All Rights Reserved. #include "UnsyncProgress.h" namespace unsync { std::atomic GGlobalProgressCurrent; std::atomic GGlobalProgressTotal; void AddGlobalProgress(uint64 Size, EBlockListType ListType) { if (ListType == EBlockListType::Source) { Size *= GLOBAL_PROGRESS_SOURCE_SCALE; } else { Size *= GLOBAL_PROGRESS_BASE_SCALE; } GGlobalProgressCurrent += Size; } FLogProgressScope::FLogProgressScope(uint64 InTotal, ELogProgressUnits InUnits, uint64 InPeriodMilliseconds, bool bInVerboseOnly) : bParentThreadVerbose(GLogVerbose) , ParentThreadIndent(GLogIndent) , Current(0) , Total(InTotal) , PeriodMilliseconds(InPeriodMilliseconds) , Units(InUnits) , NextProgressLogTime(TimePointNow()) , bEnabled(true) , bVerboseOnly(bInVerboseOnly) { Add(0); } void FLogProgressScope::Complete() { Add(0, true); } void FLogProgressScope::Add(uint64 X, bool bForceComplete) { if (!bEnabled) { return; } Current += X; std::lock_guard LockGuard(Mutex); const uint64 CurrentClamped = std::min(Current, Total); const bool bComplete = (CurrentClamped == Total) || bForceComplete; const ELogLevel LogLevel = bVerboseOnly ? ELogLevel::Debug : ELogLevel::Info; if (bEnabled && (!bVerboseOnly || GLogVerbose) && (TimePointNow() > NextProgressLogTime || bComplete)) { const wchar_t* Ending = bComplete ? L"\n" : L"\r"; switch (Units) { case ELogProgressUnits::GB: LogPrintf(LogLevel, L"%.2f / %.2f GB%ls", double(CurrentClamped) / double(1_GB), double(Total) / double(1_GB), Ending); break; case ELogProgressUnits::MB: LogPrintf(LogLevel, L"%.2f / %.2f MB%ls", double(CurrentClamped) / double(1_MB), double(Total) / double(1_MB), Ending); break; case ELogProgressUnits::Bytes: LogPrintf(LogLevel, L"%llu / %llu bytes%ls", (uint64)CurrentClamped, Total, Ending); break; case ELogProgressUnits::Raw: default: LogPrintf(LogLevel, L"%llu / %llu%ls", (uint64)CurrentClamped, Total, Ending); break; } NextProgressLogTime = TimePointNow() + std::chrono::milliseconds(PeriodMilliseconds); LogGlobalProgress(); if (bComplete) { bEnabled = false; } } } } // namespace unsync