Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main/src
diff options
context:
space:
mode:
authortherzok <marius.ungureanu@xamarin.com>2019-07-21 22:32:11 +0300
committertherzok <marius.ungureanu@xamarin.com>2019-07-22 14:54:43 +0300
commitaff0f8d3dc2188a468f397cc9e49c7aed4f03bb6 (patch)
tree36f7f43d61278d7a3c75e6cc002deea5db40f1ce /main/src
parentc48256f8e332885c81b14134ef5778da2e333844 (diff)
[Core] Add an example usage of ReaderWriterLockSlim
this should improve parallelism on concurrent reads from the assembly name cache
Diffstat (limited to 'main/src')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs12
1 files changed, 8 insertions, 4 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs
index 8817782fed..5eb2a9b08d 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs
@@ -234,22 +234,26 @@ namespace MonoDevelop.Core.Assemblies
return aname;
}
+ static readonly ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim ();
static readonly Dictionary<string, AssemblyName> assemblyNameCache = new Dictionary<string, AssemblyName> ();
internal static AssemblyName GetAssemblyNameObj (string file)
{
AssemblyName name;
- lock (assemblyNameCache) {
+ using (readerWriterLock.Read ()) {
if (assemblyNameCache.TryGetValue (file, out name))
return name;
}
try {
name = AssemblyName.GetAssemblyName (file);
- lock (assemblyNameCache) {
- assemblyNameCache [file] = name;
+
+ using (readerWriterLock.Write ()) {
+ if (assemblyNameCache.TryGetValue (file, out var alreadyAdded))
+ return alreadyAdded;
+
+ return assemblyNameCache [file] = name;
}
- return name;
} catch (FileNotFoundException) {
// GetAssemblyName is not case insensitive in mono/windows. This is a workaround
foreach (string f in Directory.GetFiles (Path.GetDirectoryName (file), Path.GetFileName (file))) {