Fix thread safety issue in XmlDocumentation Provider by replacing Dictionary with ConcurrentDictionary #18798
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The
XmlDocumentation.Provider
class in the F# Editor was using a regularDictionary<string, IVsXMLMemberIndex>
for caching XML member indexes, which is not thread-safe and could lead to race conditions, corrupted state, or infinite loops in multithreaded scenarios.The original implementation had a classic check-then-act race condition:
Solution
Replaced
Dictionary
withConcurrentDictionary
and refactored the method to use the thread-safeGetOrAdd
pattern:Changes Made
open System.Collections.Concurrent
Dictionary<string, IVsXMLMemberIndex>()
→ConcurrentDictionary<string, IVsXMLMemberIndex>()
GetOrAdd
to atomically check-and-add, eliminating the race conditionBenefits
ConcurrentDictionary
is optimized for concurrent accessThe fix follows existing patterns used throughout the F# compiler codebase and maintains full backward compatibility while ensuring robust operation in multithreaded environments.
This pull request was created as a result of the following prompt from Copilot chat.
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.