From 3db9c5dbe3d90d8cfd6fee027e3f6d056373ebe6 Mon Sep 17 00:00:00 2001 From: Ryan Kistner Date: Fri, 14 Aug 2020 10:58:03 -0600 Subject: [PATCH] Notify about pre-allocation. Just lock the counter object. --- DepotDownloader/ContentDownloader.cs | 55 +++++++++++++++++++--------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index 75e66380..faa09a7b 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -602,16 +602,16 @@ namespace DepotDownloader private class GlobalDownloadCounter { - public long TotalBytesCompressed; - public long TotalBytesUncompressed; + public ulong TotalBytesCompressed; + public ulong TotalBytesUncompressed; } private class DepotDownloadCounter { - public long CompleteDownloadSize; - public long SizeDownloaded; - public long DepotBytesCompressed; - public long DepotBytesUncompressed; + public ulong CompleteDownloadSize; + public ulong SizeDownloaded; + public ulong DepotBytesCompressed; + public ulong DepotBytesUncompressed; } @@ -831,7 +831,7 @@ namespace DepotDownloader Directory.CreateDirectory(Path.GetDirectoryName(fileFinalPath)); Directory.CreateDirectory(Path.GetDirectoryName(fileStagingPath)); - Interlocked.Add(ref depotCounter.CompleteDownloadSize, (long)file.TotalSize); + depotCounter.CompleteDownloadSize += file.TotalSize; } }); @@ -884,6 +884,8 @@ namespace DepotDownloader FileInfo fi = new FileInfo(fileFinalPath); if (!fi.Exists) { + Console.WriteLine("Pre-allocating {0}", fileFinalPath); + // create new file. need all chunks fs = File.Create(fileFinalPath); fs.SetLength((long)file.TotalSize); @@ -973,8 +975,11 @@ namespace DepotDownloader if (neededChunks.Count() == 0) { - var sizeDownloaded = Interlocked.Add(ref depotDownloadCounter.SizeDownloaded, (long)file.TotalSize); - Console.WriteLine("{0,6:#00.00}% {1}", ((float)sizeDownloaded / (float)depotDownloadCounter.CompleteDownloadSize) * 100.0f, fileFinalPath); + lock (depotDownloadCounter) + { + depotDownloadCounter.SizeDownloaded += (ulong)file.TotalSize; + Console.WriteLine("{0,6:#00.00}% {1}", ((float)depotDownloadCounter.SizeDownloaded / (float)depotDownloadCounter.CompleteDownloadSize) * 100.0f, fileFinalPath); + } if (fs != null) fs.Dispose(); @@ -982,8 +987,11 @@ namespace DepotDownloader } else { - var sizeDownloaded = ((long)file.TotalSize - (long)neededChunks.Select(x => (long)x.UncompressedLength).Sum()); - Interlocked.Add(ref depotDownloadCounter.SizeDownloaded, sizeDownloaded); + var sizeOnDisk = (file.TotalSize - (ulong)neededChunks.Select(x => (long)x.UncompressedLength).Sum()); + lock (depotDownloadCounter) + { + depotDownloadCounter.SizeDownloaded += sizeOnDisk; + } } } @@ -1087,19 +1095,30 @@ namespace DepotDownloader fileStreamData.fileLock.Release(); } - Interlocked.Add(ref downloadCounter.TotalBytesCompressed, chunk.CompressedLength); - Interlocked.Add(ref depotDownloadCounter.DepotBytesCompressed, chunk.CompressedLength); - Interlocked.Add(ref downloadCounter.TotalBytesUncompressed, chunk.UncompressedLength); - Interlocked.Add(ref depotDownloadCounter.DepotBytesUncompressed, chunk.UncompressedLength); - - var sizeDownloaded = Interlocked.Add(ref depotDownloadCounter.SizeDownloaded, chunkData.Data.Length); - int remainingChunks = Interlocked.Decrement(ref fileStreamData.chunksToDownload); if (remainingChunks == 0) { fileStreamData.fileStream.Dispose(); fileStreamData.fileLock.Dispose(); + } + ulong sizeDownloaded = 0; + lock (depotDownloadCounter) + { + sizeDownloaded = depotDownloadCounter.SizeDownloaded + (ulong)chunkData.Data.Length; + depotDownloadCounter.SizeDownloaded = sizeDownloaded; + depotDownloadCounter.DepotBytesCompressed += chunk.CompressedLength; + depotDownloadCounter.DepotBytesUncompressed += chunk.UncompressedLength; + } + + lock (downloadCounter) + { + downloadCounter.TotalBytesCompressed += chunk.CompressedLength; + downloadCounter.TotalBytesUncompressed += chunk.UncompressedLength; + } + + if (remainingChunks == 0) + { var fileFinalPath = Path.Combine(depot.installDir, file.FileName); Console.WriteLine("{0,6:#00.00}% {1}", ((float)sizeDownloaded / (float)depotDownloadCounter.CompleteDownloadSize) * 100.0f, fileFinalPath); }