Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
d8c89de9
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d8c89de9
编写于
7月 03, 2017
作者:
H
Heejae Chang
提交者:
GitHub
7月 03, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #20051 from heejaechang/FixRace
fix race on _storage field.
上级
be3834ce
3b317f7c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
39 addition
and
4 deletion
+39
-4
src/Workspaces/Core/Portable/Utilities/ValuesSources/RecoverableWeakValueSource.cs
...ble/Utilities/ValuesSources/RecoverableWeakValueSource.cs
+5
-1
src/Workspaces/Core/Portable/Workspace/Host/SyntaxTreeFactory/AbstractSyntaxTreeFactoryService.AbstractRecoverableSyntaxRoot.cs
...SyntaxTreeFactoryService.AbstractRecoverableSyntaxRoot.cs
+6
-3
src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs
src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs
+28
-0
未找到文件。
src/Workspaces/Core/Portable/Utilities/ValuesSources/RecoverableWeakValueSource.cs
浏览文件 @
d8c89de9
...
@@ -65,7 +65,11 @@ public RecoverableWeakValueSource(RecoverableWeakValueSource<T> savedSource)
...
@@ -65,7 +65,11 @@ public RecoverableWeakValueSource(RecoverableWeakValueSource<T> savedSource)
public
override
bool
TryGetValue
(
out
T
value
)
public
override
bool
TryGetValue
(
out
T
value
)
{
{
return
_weakInstance
.
TryGetTarget
(
out
value
);
// it has 2 fields that can hold onto the value. if we only check weakInstance, we will
// return false for the initial case where weakInstance is set to s_noReference even if
// value can be retrieved from _recoverySource. so we check both here.
return
_weakInstance
.
TryGetTarget
(
out
value
)
||
_recoverySource
.
TryGetValue
(
out
value
);
}
}
public
override
T
GetValue
(
CancellationToken
cancellationToken
)
public
override
T
GetValue
(
CancellationToken
cancellationToken
)
...
...
src/Workspaces/Core/Portable/Workspace/Host/SyntaxTreeFactory/AbstractSyntaxTreeFactoryService.AbstractRecoverableSyntaxRoot.cs
浏览文件 @
d8c89de9
...
@@ -82,6 +82,8 @@ internal sealed class RecoverableSyntaxRoot<TRoot> : RecoverableWeakValueSource<
...
@@ -82,6 +82,8 @@ internal sealed class RecoverableSyntaxRoot<TRoot> : RecoverableWeakValueSource<
IRecoverableSyntaxTree
<
TRoot
>
containingTree
)
IRecoverableSyntaxTree
<
TRoot
>
containingTree
)
:
base
(
originalRoot
)
:
base
(
originalRoot
)
{
{
Contract
.
ThrowIfNull
(
originalRoot
.
_storage
);
_service
=
originalRoot
.
_service
;
_service
=
originalRoot
.
_service
;
_storage
=
originalRoot
.
_storage
;
_storage
=
originalRoot
.
_storage
;
_containingTree
=
containingTree
;
_containingTree
=
containingTree
;
...
@@ -89,14 +91,15 @@ internal sealed class RecoverableSyntaxRoot<TRoot> : RecoverableWeakValueSource<
...
@@ -89,14 +91,15 @@ internal sealed class RecoverableSyntaxRoot<TRoot> : RecoverableWeakValueSource<
public
RecoverableSyntaxRoot
<
TRoot
>
WithSyntaxTree
(
IRecoverableSyntaxTree
<
TRoot
>
containingTree
)
public
RecoverableSyntaxRoot
<
TRoot
>
WithSyntaxTree
(
IRecoverableSyntaxTree
<
TRoot
>
containingTree
)
{
{
// at this point, we should either have strongly held root or _storage should not be null
if
(
this
.
TryGetValue
(
out
var
root
))
if
(
this
.
TryGetValue
(
out
var
root
))
{
{
var
result
=
new
RecoverableSyntaxRoot
<
TRoot
>(
_service
,
root
,
containingTree
);
// we have strongly held root
result
.
_storage
=
_storage
;
return
new
RecoverableSyntaxRoot
<
TRoot
>(
_service
,
root
,
containingTree
);
return
result
;
}
}
else
else
{
{
// we have _storage here. _storage != null is checked inside
return
new
RecoverableSyntaxRoot
<
TRoot
>(
this
,
containingTree
);
return
new
RecoverableSyntaxRoot
<
TRoot
>(
this
,
containingTree
);
}
}
}
}
...
...
src/Workspaces/CoreTest/SolutionTests/SolutionTests.cs
浏览文件 @
d8c89de9
...
@@ -1465,6 +1465,34 @@ public async Task TestMassiveFileSize()
...
@@ -1465,6 +1465,34 @@ public async Task TestMassiveFileSize()
}
}
}
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
Workspace
)]
[
WorkItem
(
18697
,
"https://github.com/dotnet/roslyn/issues/18697"
)]
public
void
TestWithSyntaxTree
()
{
// get one to get to syntax tree factory
var
dummyProject
=
CreateNotKeptAliveSolution
().
AddProject
(
"dummy"
,
"dummy"
,
LanguageNames
.
CSharp
);
var
factory
=
dummyProject
.
LanguageServices
.
SyntaxTreeFactory
;
// create the origin tree
var
strongTree
=
factory
.
ParseSyntaxTree
(
"dummy"
,
dummyProject
.
ParseOptions
,
SourceText
.
From
(
"// emtpy"
),
CancellationToken
.
None
);
// create recoverable tree off the original tree
var
recoverableTree
=
factory
.
CreateRecoverableTree
(
dummyProject
.
Id
,
strongTree
.
FilePath
,
strongTree
.
Options
,
new
ConstantValueSource
<
TextAndVersion
>(
TextAndVersion
.
Create
(
strongTree
.
GetText
(),
VersionStamp
.
Create
(),
strongTree
.
FilePath
)),
strongTree
.
GetText
().
Encoding
,
strongTree
.
GetRoot
());
// create new tree before it ever getting root node
var
newTree
=
recoverableTree
.
WithFilePath
(
"different/dummy"
);
// this shouldn't throw
var
root
=
newTree
.
GetRoot
();
}
private
static
void
GetMultipleProjects
(
private
static
void
GetMultipleProjects
(
out
Project
csBrokenProject
,
out
Project
csBrokenProject
,
out
Project
vbNormalProject
,
out
Project
vbNormalProject
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录