diff options
author | therzok <marius.ungureanu@xamarin.com> | 2019-07-21 22:32:11 +0300 |
---|---|---|
committer | therzok <marius.ungureanu@xamarin.com> | 2019-07-22 14:54:43 +0300 |
commit | aff0f8d3dc2188a468f397cc9e49c7aed4f03bb6 (patch) | |
tree | 36f7f43d61278d7a3c75e6cc002deea5db40f1ce /main/src | |
parent | c48256f8e332885c81b14134ef5778da2e333844 (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.cs | 12 |
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))) { |