Skip to content

Commit

Permalink
Merge pull request #9815 from gafter/future-stabilization-9759
Browse files Browse the repository at this point in the history
Fix a race in the production of compilation events.
  • Loading branch information
davkean committed Mar 17, 2016
2 parents 64576fe + 517bcca commit af0922b
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 32 deletions.
25 changes: 7 additions & 18 deletions src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1698,34 +1698,23 @@ private AliasSymbol CreateGlobalNamespaceAlias()

private void CompleteTree(SyntaxTree tree)
{
bool completedCompilationUnit = false;
bool completedCompilation = false;

if (_lazyCompilationUnitCompletedTrees == null) Interlocked.CompareExchange(ref _lazyCompilationUnitCompletedTrees, new HashSet<SyntaxTree>(), null);
lock (_lazyCompilationUnitCompletedTrees)
{
if (_lazyCompilationUnitCompletedTrees.Add(tree))
{
completedCompilationUnit = true;
// signal the end of the compilation unit
EventQueue.TryEnqueue(new CompilationUnitCompletedEvent(this, tree));

if (_lazyCompilationUnitCompletedTrees.Count == this.SyntaxTrees.Length)
{
completedCompilation = true;
// if that was the last tree, signal the end of compilation
EventQueue.TryEnqueue(new CompilationCompletedEvent(this));
EventQueue.PromiseNotToEnqueue();
EventQueue.TryComplete();
}
}
}

if (completedCompilationUnit)
{
EventQueue.TryEnqueue(new CompilationUnitCompletedEvent(this, tree));
}

if (completedCompilation)
{
// signal the end of compilation events
EventQueue.TryEnqueue(new CompilationCompletedEvent(this));
EventQueue.PromiseNotToEnqueue();
EventQueue.TryComplete();
}
}

internal void ReportUnusedImports(DiagnosticBag diagnostics, CancellationToken cancellationToken, SyntaxTree filterTree = null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1632,31 +1632,24 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If

Debug.Assert(AllSyntaxTrees.Contains(tree))
Dim completedCompilationUnit As Boolean = False
Dim completedCompilation As Boolean = False

If _lazyCompilationUnitCompletedTrees Is Nothing Then
Interlocked.CompareExchange(_lazyCompilationUnitCompletedTrees, New HashSet(Of SyntaxTree)(), Nothing)
End If

SyncLock _lazyCompilationUnitCompletedTrees
If _lazyCompilationUnitCompletedTrees.Add(tree) Then
completedCompilationUnit = True
' signal the end of the compilation unit
EventQueue.TryEnqueue(New CompilationUnitCompletedEvent(Me, tree))

If _lazyCompilationUnitCompletedTrees.Count = SyntaxTrees.Length Then
completedCompilation = True
' if that was the last tree, signal the end of compilation
EventQueue.TryEnqueue(New CompilationCompletedEvent(Me))
EventQueue.PromiseNotToEnqueue()
EventQueue.TryComplete()
End If
End If
End SyncLock

If completedCompilationUnit Then
EventQueue.TryEnqueue(New CompilationUnitCompletedEvent(Me, tree))
End If

If completedCompilation Then
EventQueue.TryEnqueue(New CompilationCompletedEvent(Me))
EventQueue.PromiseNotToEnqueue()
EventQueue.TryComplete() ' signal the End Of compilation events
End If
End Sub

Friend Function ShouldAddEvent(symbol As Symbol) As Boolean
Expand Down

0 comments on commit af0922b

Please sign in to comment.