Skip to content

Commit 2796932

Browse files
authored
Fix thread safety issue in XmlDocumentation Provider by replacing Dictionary with ConcurrentDictionary (#18798)
1 parent a15e243 commit 2796932

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

vsintegration/src/FSharp.Editor/DocComments/XMLDocumentation.fs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Microsoft.VisualStudio.FSharp.Editor
44

55
open System
6+
open System.Collections.Concurrent
67
open System.Collections.Immutable
78
open System.Runtime.CompilerServices
89
open System.Text.RegularExpressions
@@ -288,27 +289,26 @@ module internal XmlDocumentation =
288289
/// Provide Xml Documentation
289290
type Provider(xmlIndexService: IVsXMLMemberIndexService) =
290291
/// Index of assembly name to xml member index.
291-
let cache = Dictionary<string, IVsXMLMemberIndex>()
292+
let cache = ConcurrentDictionary<string, IVsXMLMemberIndex>()
292293

293294
do Events.SolutionEvents.OnAfterCloseSolution.Add(fun _ -> cache.Clear())
294295

295296
/// Retrieve the preexisting xml index or None
296297
let GetMemberIndexOfAssembly (assemblyName) =
297-
match cache.TryGetValue(assemblyName) with
298-
| true, memberIndex -> Some(memberIndex)
299-
| false, _ ->
300-
let ok, memberIndex = xmlIndexService.CreateXMLMemberIndex(assemblyName)
301-
302-
if Com.Succeeded(ok) then
303-
let ok = memberIndex.BuildMemberIndex()
304-
305-
if Com.Succeeded(ok) then
306-
cache.Add(assemblyName, memberIndex)
307-
Some(memberIndex)
308-
else
309-
None
310-
else
311-
None
298+
let memberIndex =
299+
cache.GetOrAdd(
300+
assemblyName,
301+
fun name ->
302+
let ok, memberIndex = xmlIndexService.CreateXMLMemberIndex(name)
303+
304+
if Com.Succeeded(ok) then
305+
let ok = memberIndex.BuildMemberIndex()
306+
if Com.Succeeded(ok) then memberIndex else null
307+
else
308+
null
309+
)
310+
311+
if memberIndex <> null then Some(memberIndex) else None
312312

313313
let AppendMemberData
314314
(

0 commit comments

Comments
 (0)