Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
42b41179
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,发现更多精彩内容 >>
未验证
提交
42b41179
编写于
6月 14, 2018
作者:
J
Jason Malinowski
提交者:
GitHub
6月 14, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #27650 from jasonmalinowski/fix-threading-of-shadow-copy-provider
Make ShadowCopyAnalyzerAssemblyLoader threadsafe
上级
e17f775b
e6b13965
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
18 deletion
+15
-18
src/Compilers/Shared/ShadowCopyAnalyzerAssemblyLoader.cs
src/Compilers/Shared/ShadowCopyAnalyzerAssemblyLoader.cs
+15
-18
未找到文件。
src/Compilers/Shared/ShadowCopyAnalyzerAssemblyLoader.cs
浏览文件 @
42b41179
...
...
@@ -28,13 +28,12 @@ internal sealed class ShadowCopyAnalyzerAssemblyLoader :
/// <summary>
/// The directory where this instance of <see cref="ShadowCopyAnalyzerAssemblyLoader"/>
/// will shadow-copy assemblies.
/// will shadow-copy assemblies
, and the mutex created to mark that the owner of it is still active
.
/// </summary>
private
string
_shadowCopyDirectory
;
private
Mutex
_shadowCopyDirectoryMutex
;
private
readonly
Lazy
<(
string
directory
,
Mutex
)>
_shadowCopyDirectoryAndMutex
;
/// <summary>
/// Used to generate unique names for per-assembly directories.
/// Used to generate unique names for per-assembly directories.
Should be updated with <see cref="Interlocked.Increment(ref int)"/>.
/// </summary>
private
int
_assemblyDirectoryId
;
...
...
@@ -49,6 +48,9 @@ public ShadowCopyAnalyzerAssemblyLoader(string baseDirectory = null)
_baseDirectory
=
Path
.
Combine
(
Path
.
GetTempPath
(),
"CodeAnalysis"
,
"AnalyzerShadowCopies"
);
}
_shadowCopyDirectoryAndMutex
=
new
Lazy
<(
string
directory
,
Mutex
)>(
()
=>
CreateUniqueDirectoryForProcess
(),
LazyThreadSafetyMode
.
ExecutionAndPublication
);
DeleteLeftoverDirectoriesTask
=
Task
.
Run
((
Action
)
DeleteLeftoverDirectories
);
}
...
...
@@ -95,18 +97,13 @@ private void DeleteLeftoverDirectories()
protected
override
Assembly
LoadImpl
(
string
fullPath
)
{
if
(
_shadowCopyDirectory
==
null
)
{
_shadowCopyDirectory
=
CreateUniqueDirectoryForProcess
();
}
string
assemblyDirectory
=
CreateUniqueDirectoryForAssembly
();
string
shadowCopyPath
=
CopyFileAndResources
(
fullPath
,
assemblyDirectory
);
return
base
.
LoadImpl
(
shadowCopyPath
);
}
private
string
CopyFileAndResources
(
string
fullPath
,
string
assemblyDirectory
)
private
st
atic
st
ring
CopyFileAndResources
(
string
fullPath
,
string
assemblyDirectory
)
{
string
fileNameWithExtension
=
Path
.
GetFileName
(
fullPath
);
string
shadowCopyPath
=
Path
.
Combine
(
assemblyDirectory
,
fileNameWithExtension
);
...
...
@@ -140,7 +137,7 @@ private string CopyFileAndResources(string fullPath, string assemblyDirectory)
return
shadowCopyPath
;
}
private
void
CopyFile
(
string
originalPath
,
string
shadowCopyPath
)
private
static
void
CopyFile
(
string
originalPath
,
string
shadowCopyPath
)
{
var
directory
=
Path
.
GetDirectoryName
(
shadowCopyPath
);
Directory
.
CreateDirectory
(
directory
);
...
...
@@ -150,7 +147,7 @@ private void CopyFile(string originalPath, string shadowCopyPath)
ClearReadOnlyFlagOnFile
(
new
FileInfo
(
shadowCopyPath
));
}
private
void
ClearReadOnlyFlagOnFiles
(
string
directoryPath
)
private
static
void
ClearReadOnlyFlagOnFiles
(
string
directoryPath
)
{
DirectoryInfo
directory
=
new
DirectoryInfo
(
directoryPath
);
...
...
@@ -160,7 +157,7 @@ private void ClearReadOnlyFlagOnFiles(string directoryPath)
}
}
private
void
ClearReadOnlyFlagOnFile
(
FileInfo
fileInfo
)
private
static
void
ClearReadOnlyFlagOnFile
(
FileInfo
fileInfo
)
{
try
{
...
...
@@ -177,24 +174,24 @@ private void ClearReadOnlyFlagOnFile(FileInfo fileInfo)
private
string
CreateUniqueDirectoryForAssembly
()
{
int
directoryId
=
_assemblyDirectoryId
++
;
int
directoryId
=
Interlocked
.
Increment
(
ref
_assemblyDirectoryId
)
;
string
directory
=
Path
.
Combine
(
_shadowCopyDirectory
,
directoryId
.
ToString
());
string
directory
=
Path
.
Combine
(
_shadowCopyDirectory
AndMutex
.
Value
.
directory
,
directoryId
.
ToString
());
Directory
.
CreateDirectory
(
directory
);
return
directory
;
}
private
string
CreateUniqueDirectoryForProcess
()
private
(
string
directory
,
Mutex
mutex
)
CreateUniqueDirectoryForProcess
()
{
string
guid
=
Guid
.
NewGuid
().
ToString
(
"N"
).
ToLowerInvariant
();
string
directory
=
Path
.
Combine
(
_baseDirectory
,
guid
);
_shadowCopyDirectoryM
utex
=
new
Mutex
(
initiallyOwned
:
false
,
name
:
guid
);
var
m
utex
=
new
Mutex
(
initiallyOwned
:
false
,
name
:
guid
);
Directory
.
CreateDirectory
(
directory
);
return
directory
;
return
(
directory
,
mutex
)
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录