Skip to content

Commit 75ece81

Browse files
authored
Fix race in isFromExternalLibrary (#1276)
1 parent e09e343 commit 75ece81

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

internal/compiler/fileloadertask.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ type fileLoaderWorker[K fileLoaderWorkerTask[K]] struct {
2929
}
3030

3131
type queuedTask[K fileLoaderWorkerTask[K]] struct {
32-
task K
33-
mu sync.Mutex
34-
lowestDepth int
32+
task K
33+
mu sync.Mutex
34+
lowestDepth int
35+
fromExternalLibrary bool
3536
}
3637

3738
func (w *fileLoaderWorker[K]) runAndWait(loader *fileLoader, tasks []K) {
@@ -47,30 +48,31 @@ func (w *fileLoaderWorker[K]) start(loader *fileLoader, tasks []K, depth int, is
4748
task = loadedTask.task
4849
if loaded {
4950
tasks[i] = task
51+
// Add in the loaded task's external-ness.
52+
taskIsFromExternalLibrary = taskIsFromExternalLibrary || task.isFromExternalLibrary()
5053
}
5154

5255
w.wg.Queue(func() {
5356
loadedTask.mu.Lock()
5457
defer loadedTask.mu.Unlock()
5558

59+
startSubtasks := false
60+
5661
currentDepth := depth
5762
if task.shouldIncreaseDepth() {
5863
currentDepth++
5964
}
60-
61-
startSubtasks := false
62-
6365
if currentDepth < loadedTask.lowestDepth {
6466
// If we're seeing this task at a lower depth than before,
6567
// reprocess its subtasks to ensure they are loaded.
6668
loadedTask.lowestDepth = currentDepth
6769
startSubtasks = true
6870
}
6971

70-
if !task.isRoot() && taskIsFromExternalLibrary && !task.isFromExternalLibrary() {
72+
if !task.isRoot() && taskIsFromExternalLibrary && !loadedTask.fromExternalLibrary {
7173
// If we're seeing this task now as an external library,
7274
// reprocess its subtasks to ensure they are also marked as external.
73-
task.markFromExternalLibrary()
75+
loadedTask.fromExternalLibrary = true
7476
startSubtasks = true
7577
}
7678

@@ -83,13 +85,20 @@ func (w *fileLoaderWorker[K]) start(loader *fileLoader, tasks []K, depth int, is
8385
}
8486

8587
if startSubtasks {
86-
w.start(loader, task.getSubTasks(), loadedTask.lowestDepth, task.isFromExternalLibrary())
88+
w.start(loader, task.getSubTasks(), loadedTask.lowestDepth, loadedTask.fromExternalLibrary)
8789
}
8890
})
8991
}
9092
}
9193

9294
func (w *fileLoaderWorker[K]) collect(loader *fileLoader, tasks []K, iterate func(K, []tspath.Path)) []tspath.Path {
95+
// Mark all tasks we saw as external after the fact.
96+
w.tasksByFileName.Range(func(key string, value *queuedTask[K]) bool {
97+
if value.fromExternalLibrary {
98+
value.task.markFromExternalLibrary()
99+
}
100+
return true
101+
})
93102
return w.collectWorker(loader, tasks, iterate, collections.Set[K]{})
94103
}
95104

0 commit comments

Comments
 (0)