提交 ad16d1ce 编写于 作者: J Jason Malinowski

Add some locks assertions to confirm _NoLock methods were called correctly

上级 af1ede04
......@@ -1464,7 +1464,11 @@ public void ApplyBatchChangeToWorkspace(Func<CodeAnalysis.Solution, SolutionChan
private readonly Dictionary<ProjectId, ProjectReferenceInformation> _projectReferenceInfoMap = new Dictionary<ProjectId, ProjectReferenceInformation>();
private ProjectReferenceInformation GetReferenceInfo_NoLock(ProjectId projectId)
=> _projectReferenceInfoMap.GetOrAdd(projectId, _ => new ProjectReferenceInformation());
{
Debug.Assert(Monitor.IsEntered(_gate));
return _projectReferenceInfoMap.GetOrAdd(projectId, _ => new ProjectReferenceInformation());
}
protected internal override void OnProjectRemoved(ProjectId projectId)
{
......@@ -1575,12 +1579,14 @@ public void AddProjectOutputPath(ProjectId projectId, string outputPath)
Constraint = "Avoid calling " + nameof(CodeAnalysis.Solution.GetProject) + " to avoid realizing all projects.")]
private void ConvertMetadataReferencesToProjectReferences_NoLock(ProjectId projectId, string outputPath)
{
Debug.Assert(Monitor.IsEntered(_gate));
var modifiedSolution = this.CurrentSolution;
using var _ = PooledHashSet<ProjectId>.GetInstance(out var projectIdsChanged);
foreach (var projectIdToRetarget in this.CurrentSolution.ProjectIds)
{
if (CanConvertMetadataReferenceToProjectReference(projectIdToRetarget, referencedProjectId: projectId))
if (CanConvertMetadataReferenceToProjectReference_NoLock(projectIdToRetarget, referencedProjectId: projectId))
{
// PERF: call GetProjectState instead of GetProject, otherwise creating a new project might force all
// Project instances to get created.
......@@ -1611,8 +1617,10 @@ private void ConvertMetadataReferencesToProjectReferences_NoLock(ProjectId proje
[PerformanceSensitive("https://github.com/dotnet/roslyn/issues/31306",
Constraint = "Avoid calling " + nameof(CodeAnalysis.Solution.GetProject) + " to avoid realizing all projects.")]
private bool CanConvertMetadataReferenceToProjectReference(ProjectId projectIdWithMetadataReference, ProjectId referencedProjectId)
private bool CanConvertMetadataReferenceToProjectReference_NoLock(ProjectId projectIdWithMetadataReference, ProjectId referencedProjectId)
{
Debug.Assert(Monitor.IsEntered(_gate));
// PERF: call GetProjectState instead of GetProject, otherwise creating a new project might force all
// Project instances to get created.
var projectWithMetadataReference = CurrentSolution.GetProjectState(projectIdWithMetadataReference);
......@@ -1649,6 +1657,8 @@ private bool CanConvertMetadataReferenceToProjectReference(ProjectId projectIdWi
Constraint = "Update ConvertedProjectReferences in place to avoid duplicate list allocations.")]
private void ConvertProjectReferencesToMetadataReferences_NoLock(ProjectId projectId, string outputPath)
{
Debug.Assert(Monitor.IsEntered(_gate));
var modifiedSolution = this.CurrentSolution;
using var _ = PooledHashSet<ProjectId>.GetInstance(out var projectIdsChanged);
......@@ -1697,7 +1707,7 @@ private void ConvertProjectReferencesToMetadataReferences_NoLock(ProjectId proje
{
var projectIdToReference = ids.First();
if (CanConvertMetadataReferenceToProjectReference(referencingProject, projectIdToReference))
if (CanConvertMetadataReferenceToProjectReference_NoLock(referencingProject, projectIdToReference))
{
var projectReference = new ProjectReference(
projectIdToReference,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册