Skip to content

Commit b82d88d

Browse files
committed
Add semaphore for concurrent downloads in SourceLink to prevent race conditions
1 parent c0dedfd commit b82d88d

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

src/FsAutoComplete.Core/Sourcelink.fs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ open FsAutoComplete.Logging
99
open FSharp.UMX
1010
open FsAutoComplete.Utils
1111
open Ionide.ProjInfo.ProjectSystem
12+
open IcedTasks
1213

1314
let logger = LogProvider.getLoggerByName "FsAutoComplete.Sourcelink"
1415

@@ -217,6 +218,8 @@ let private tryGetUrlForDocument (json: SourceLinkJson) (document: Document) =
217218
else
218219
tryGetUrlWithExactMatch path url document)
219220

221+
let sourceLinkSemaphore = new System.Threading.SemaphoreSlim(1, 1)
222+
220223
let private downloadFileToTempDir
221224
(url: string<Url>)
222225
(repoPathFragment: string<NormalizedRepoPathSegment>)
@@ -228,7 +231,8 @@ let private downloadFileToTempDir
228231
let tempDir = Path.GetDirectoryName tempFile
229232
Directory.CreateDirectory tempDir |> ignore
230233

231-
async {
234+
asyncEx {
235+
use! _ = sourceLinkSemaphore.LockAsync()
232236
// Check if file already exists (cached from previous download)
233237
if File.Exists tempFile then
234238
logger.info (

0 commit comments

Comments
 (0)