From ea7c851748ab060434d66da3d2e2532a3e3f6580 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 9 Nov 2022 19:16:21 +0200 Subject: [PATCH] [K/N][IR][codegen] Fixed a number of thread safety problems --- .../src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt | 4 +++- .../src/org/jetbrains/kotlin/backend/konan/Context.kt | 4 +++- .../kotlin/backend/konan/serialization/KonanIrlinker.kt | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt index ad3580abbb0..971d78dad32 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt @@ -223,10 +223,12 @@ class NaiveSourceBasedFileEntryImpl( } } + private val lineNumberLock = Any() + override fun getLineNumber(offset: Int): Int { if (offset == SYNTHETIC_OFFSET) return 0 if (offset < 0) return -1 - return calculatedBeforeLineNumbers.get(offset) + return synchronized(lineNumberLock) { calculatedBeforeLineNumbers.get(offset) } } override fun getColumnNumber(offset: Int): Int { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index dcfe493bc3e..a5ec45ba76a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -31,6 +31,8 @@ import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.module +import java.util.concurrent.ConcurrentHashMap +import kotlin.LazyThreadSafetyMode.PUBLICATION internal class NativeMapping : DefaultMapping() { data class BridgeKey(val target: IrSimpleFunction, val bridgeDirections: BridgeDirections) @@ -42,7 +44,7 @@ internal class NativeMapping : DefaultMapping() { val outerThisFields = DefaultDelegateFactory.newDeclarationToDeclarationMapping() val enumValueGetters = DefaultDelegateFactory.newDeclarationToDeclarationMapping() val enumEntriesMaps = mutableMapOf>() - val bridges = mutableMapOf() + val bridges = ConcurrentHashMap() val partiallyLoweredInlineFunctions = mutableMapOf() val outerThisCacheAccessors = DefaultDelegateFactory.newDeclarationToDeclarationMapping() val lateinitPropertyCacheAccessors = DefaultDelegateFactory.newDeclarationToDeclarationMapping() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 629e333ad03..36c1b088ec4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -811,7 +811,9 @@ internal class KonanIrLinker( } } - fun deserializeClassFields(irClass: IrClass, outerThisFieldInfo: ClassLayoutBuilder.FieldInfo?): List { + private val lock = Any() + + fun deserializeClassFields(irClass: IrClass, outerThisFieldInfo: ClassLayoutBuilder.FieldInfo?): List = synchronized(lock) { irClass.getPackageFragment() as? IrExternalPackageFragment ?: error("Expected an external package fragment for ${irClass.render()}") val signature = irClass.symbol.signature