From 0a48d831763643ae475d4160c41beed8c70fc978 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 26 Jan 2016 16:06:10 +0300 Subject: [PATCH] Make LookupStorage thread safe #KT-10792: Fixed --- .../kotlin/incremental/LookupStorage.kt | 21 ++++++++++++++----- .../kotlin/jps/build/KotlinBuilder.kt | 3 +-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt index 4c691b500e1..23f74dd8c9c 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt @@ -42,7 +42,11 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { private val idToFile = registerMap(IdToFileMap("id-to-file".storageFile)) private val fileToId = registerMap(FileToIdMap("file-to-id".storageFile)) private val lookupMap = registerMap(LookupMap("lookups".storageFile)) + + @Volatile private var size: Int = 0 + + @Volatile private var deletedCount: Int = 0 init { @@ -53,6 +57,7 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } } + @Synchronized fun get(lookupSymbol: LookupSymbol): Collection { val key = LookupSymbolKey(lookupSymbol.name, lookupSymbol.scope) val fileIds = lookupMap[key] ?: return emptySet() @@ -63,6 +68,7 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } } + @Synchronized fun addAll(lookups: Set>>, allPaths: Set) { val pathToId = allPaths.keysToMap { addFileIfNeeded(File(it)) } @@ -74,13 +80,17 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } } - fun removeLookupsFrom(file: File) { - val id = fileToId[file] ?: return - idToFile.remove(id) - fileToId.remove(file) - deletedCount++ + @Synchronized + fun removeLookupsFrom(files: Sequence) { + for (file in files) { + val id = fileToId[file] ?: return + idToFile.remove(id) + fileToId.remove(file) + deletedCount++ + } } + @Synchronized override fun clean() { if (countersFile.exists()) { countersFile.delete() @@ -92,6 +102,7 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { super.clean() } + @Synchronized override fun flush(memoryCachesOnly: Boolean) { try { removeGarbageIfNeeded() diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 936410c8a2d..2a27f056ffe 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -560,9 +560,8 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val lookupStorage = dataManager.getStorage(KotlinDataContainerTarget, JpsLookupStorageProvider) - filesToCompile.values().forEach { lookupStorage.removeLookupsFrom(it) } val removedFiles = chunk.targets.flatMap { KotlinSourceFileCollector.getRemovedKotlinFiles(dirtyFilesHolder, it) } - removedFiles.forEach { lookupStorage.removeLookupsFrom(it) } + lookupStorage.removeLookupsFrom(filesToCompile.values().asSequence() + removedFiles.asSequence()) lookupStorage.addAll(lookupTracker.lookups.entrySet(), lookupTracker.pathInterner.values) }