3
3
using System . Diagnostics ;
4
4
using System . IO ;
5
5
using System . Linq ;
6
+ using System . Threading ;
6
7
using System . Threading . Tasks ;
7
8
using Microsoft . CodeAnalysis ;
8
9
using Microsoft . CodeAnalysis . CSharp ;
@@ -23,8 +24,6 @@ public class Analyser : IDisposable
23
24
private protected Entities . Compilation ? compilationEntity ;
24
25
private IDisposable ? compilationTrapFile ;
25
26
26
- private readonly object progressMutex = new object ( ) ;
27
-
28
27
// The bulk of the extraction work, potentially executed in parallel.
29
28
protected readonly List < Action > extractionTasks = new List < Action > ( ) ;
30
29
private int taskCount = 0 ;
@@ -131,6 +130,9 @@ private void DoAnalyseReferenceAssembly(PortableExecutableReference r)
131
130
132
131
var skipExtraction = options . Cache && File . Exists ( trapWriter . TrapFile ) ;
133
132
133
+ var currentTaskId = IncrementTaskCount ( ) ;
134
+ ReportProgressTaskStarted ( currentTaskId , assemblyPath ) ;
135
+
134
136
if ( ! skipExtraction )
135
137
{
136
138
/* Note on parallel builds:
@@ -167,7 +169,7 @@ private void DoAnalyseReferenceAssembly(PortableExecutableReference r)
167
169
}
168
170
}
169
171
170
- ReportProgress ( assemblyPath , trapWriter . TrapFile , stopwatch . Elapsed , skipExtraction ? AnalysisAction . UpToDate : AnalysisAction . Extracted ) ;
172
+ ReportProgressTaskDone ( currentTaskId , assemblyPath , trapWriter . TrapFile , stopwatch . Elapsed , skipExtraction ? AnalysisAction . UpToDate : AnalysisAction . Extracted ) ;
171
173
}
172
174
catch ( Exception ex ) // lgtm[cs/catch-of-all-exceptions]
173
175
{
@@ -177,11 +179,13 @@ private void DoAnalyseReferenceAssembly(PortableExecutableReference r)
177
179
178
180
private void DoExtractCIL ( PortableExecutableReference r )
179
181
{
182
+ var currentTaskId = IncrementTaskCount ( ) ;
183
+ ReportProgressTaskStarted ( currentTaskId , r . FilePath ) ;
180
184
var stopwatch = new Stopwatch ( ) ;
181
185
stopwatch . Start ( ) ;
182
186
CIL . Analyser . ExtractCIL ( r . FilePath ! , Logger , options , out var trapFile , out var extracted ) ;
183
187
stopwatch . Stop ( ) ;
184
- ReportProgress ( r . FilePath , trapFile , stopwatch . Elapsed , extracted ? AnalysisAction . Extracted : AnalysisAction . UpToDate ) ;
188
+ ReportProgressTaskDone ( currentTaskId , r . FilePath , trapFile , stopwatch . Elapsed , extracted ? AnalysisAction . Extracted : AnalysisAction . UpToDate ) ;
185
189
}
186
190
187
191
private void DoExtractTree ( SyntaxTree tree )
@@ -201,6 +205,9 @@ private void DoExtractTree(SyntaxTree tree)
201
205
202
206
upToDate = options . Fast && FileIsUpToDate ( sourcePath , trapWriter . TrapFile ) ;
203
207
208
+ var currentTaskId = IncrementTaskCount ( ) ;
209
+ ReportProgressTaskStarted ( currentTaskId , sourcePath ) ;
210
+
204
211
if ( ! upToDate )
205
212
{
206
213
var cx = new Context ( extractor , compilation . Clone ( ) , trapWriter , new SourceScope ( tree ) , addAssemblyTrapPrefix ) ;
@@ -221,7 +228,7 @@ private void DoExtractTree(SyntaxTree tree)
221
228
cx . PopulateAll ( ) ;
222
229
}
223
230
224
- ReportProgress ( sourcePath , trapPath , stopwatch . Elapsed , upToDate ? AnalysisAction . UpToDate : AnalysisAction . Extracted ) ;
231
+ ReportProgressTaskDone ( currentTaskId , sourcePath , trapPath , stopwatch . Elapsed , upToDate ? AnalysisAction . UpToDate : AnalysisAction . Extracted ) ;
225
232
}
226
233
catch ( Exception ex ) // lgtm[cs/catch-of-all-exceptions]
227
234
{
@@ -234,6 +241,11 @@ private void DoAnalyseCompilation()
234
241
try
235
242
{
236
243
var assemblyPath = extractor . OutputPath ;
244
+ var stopwatch = new Stopwatch ( ) ;
245
+ stopwatch . Start ( ) ;
246
+ var currentTaskId = IncrementTaskCount ( ) ;
247
+ ReportProgressTaskStarted ( currentTaskId , assemblyPath ) ;
248
+
237
249
var transformedAssemblyPath = PathTransformer . Transform ( assemblyPath ) ;
238
250
var assembly = compilation . Assembly ;
239
251
var trapWriter = transformedAssemblyPath . CreateTrapWriter ( Logger , options . TrapCompression , discardDuplicates : false ) ;
@@ -243,6 +255,8 @@ private void DoAnalyseCompilation()
243
255
compilationEntity = Entities . Compilation . Create ( cx ) ;
244
256
245
257
extractor . CompilationInfos . ForEach ( ci => trapWriter . Writer . compilation_info ( compilationEntity , ci . key , ci . value ) ) ;
258
+
259
+ ReportProgressTaskDone ( currentTaskId , assemblyPath , trapWriter . TrapFile , stopwatch . Elapsed , AnalysisAction . Extracted ) ;
246
260
}
247
261
catch ( Exception ex ) // lgtm[cs/catch-of-all-exceptions]
248
262
{
@@ -279,10 +293,19 @@ private static void AnalyseNamespace(Context cx, INamespaceSymbol ns)
279
293
}
280
294
}
281
295
282
- private void ReportProgress ( string src , string output , TimeSpan time , AnalysisAction action )
296
+ private int IncrementTaskCount ( )
297
+ {
298
+ return Interlocked . Increment ( ref taskCount ) ;
299
+ }
300
+
301
+ private void ReportProgressTaskStarted ( int currentCount , string src )
302
+ {
303
+ progressMonitor . Started ( currentCount , extractionTasks . Count , src ) ;
304
+ }
305
+
306
+ private void ReportProgressTaskDone ( int currentCount , string src , string output , TimeSpan time , AnalysisAction action )
283
307
{
284
- lock ( progressMutex )
285
- progressMonitor . Analysed ( ++ taskCount , extractionTasks . Count , src , output , time , action ) ;
308
+ progressMonitor . Analysed ( currentCount , extractionTasks . Count , src , output , time , action ) ;
286
309
}
287
310
288
311
/// <summary>
0 commit comments