Skip to content

Commit 621ca67

Browse files
committed
Fix memory leak by removing concurrentBag in Analyser. Closes #450
1 parent 694985f commit 621ca67

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

CompactGUI.Core/Analyser.vb

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Public Class Analyser
1818

1919
Public Async Function AnalyseFolder(cancellationToken As CancellationToken) As Task(Of Boolean)
2020
Dim allFiles = Await Task.Run(Function() Directory.EnumerateFiles(FolderName, "*", New EnumerationOptions() With {.RecurseSubdirectories = True, .IgnoreInaccessible = True}).AsShortPathNames, cancellationToken).ConfigureAwait(False)
21-
Dim fileDetails As New Concurrent.ConcurrentBag(Of AnalysedFileDetails)
21+
Dim fileDetails As New List(Of AnalysedFileDetails)
2222
Dim compressedFilesCount As Integer = 0
2323

2424
' Use local variables to reduce contention
@@ -27,17 +27,19 @@ Public Class Analyser
2727

2828
Try
2929
Parallel.ForEach(allFiles, New ParallelOptions With {.CancellationToken = cancellationToken},
30-
Sub(file)
31-
Dim details = AnalyseFile(file)
32-
If details IsNot Nothing Then
33-
fileDetails.Add(details)
34-
If details.CompressionMode <> CompressionAlgorithm.NO_COMPRESSION Then
35-
Interlocked.Increment(compressedFilesCount)
36-
End If
37-
Interlocked.Add(localCompressedBytes, details.CompressedSize)
38-
Interlocked.Add(localUncompressedBytes, details.UncompressedSize)
39-
End If
40-
End Sub)
30+
Sub(file)
31+
Dim details = AnalyseFile(file)
32+
If details IsNot Nothing Then
33+
SyncLock fileDetails
34+
fileDetails.Add(details)
35+
End SyncLock
36+
If details.CompressionMode <> CompressionAlgorithm.NO_COMPRESSION Then
37+
Interlocked.Increment(compressedFilesCount)
38+
End If
39+
Interlocked.Add(localCompressedBytes, details.CompressedSize)
40+
Interlocked.Add(localUncompressedBytes, details.UncompressedSize)
41+
End If
42+
End Sub)
4143

4244
' Update the shared state after the parallel loop to minimize contention
4345
CompressedBytes = localCompressedBytes
@@ -48,7 +50,7 @@ Public Class Analyser
4850
End Try
4951

5052
ContainsCompressedFiles = compressedFilesCount > 0
51-
FileCompressionDetailsList = fileDetails.ToList
53+
FileCompressionDetailsList = fileDetails
5254
Return ContainsCompressedFiles
5355
End Function
5456

0 commit comments

Comments
 (0)