From 32de9685316c82027128726b59646787c80f3d23 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Thu, 4 Jan 2024 18:23:14 +0100 Subject: [PATCH] [Names] Avoid deadlock in initialization of classId constants StandardClassIds was using Annotations subclass in its initialization. At the same time, Annotations subclass was using StandardClassIds in its initialization implicitly through baseId() method. This leads to a rare deadlock on CI in case where two different threads tried to initialize both classes at the same time. It can't be reproduced robustly, as a single thread was able to successfully initialize both, and will do it on an attempt to initialize any of them. ^KT-64720 Fixed --- .../js/checkers/expression/FirJsReflectionAPICallChecker.kt | 2 +- .../src/org/jetbrains/kotlin/name/StandardClassIds.kt | 4 ++-- .../js/resolve/diagnostics/JsReflectionAPICallChecker.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsReflectionAPICallChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsReflectionAPICallChecker.kt index 61aa9d28a49..018c6c58bf3 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsReflectionAPICallChecker.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsReflectionAPICallChecker.kt @@ -23,7 +23,7 @@ object FirJsReflectionAPICallChecker : AbstractFirReflectionApiCallChecker() { override fun isAllowedReflectionApi(name: Name, containingClassId: ClassId, context: CheckerContext): Boolean { return super.isAllowedReflectionApi(name, containingClassId, context) || - containingClassId in StandardClassIds.associatedObjectAnnotations || + containingClassId in StandardClassIds.Annotations.associatedObjectAnnotations || name == StandardNames.FqNames.findAssociatedObject.shortName() } diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 0c0b9e4605b..eac2407f463 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -93,8 +93,6 @@ object StandardClassIds { val constantAllowedTypes = primitiveTypes + unsignedTypes + String - val associatedObjectAnnotations = hashSetOf(Annotations.AssociatedObjectKey, Annotations.ExperimentalAssociatedObjects) - val Continuation = "Continuation".coroutinesId() @Suppress("FunctionName") @@ -196,6 +194,8 @@ object StandardClassIds { val AssociatedObjectKey = "AssociatedObjectKey".reflectId() val ExperimentalAssociatedObjects = "ExperimentalAssociatedObjects".reflectId() + val associatedObjectAnnotations = hashSetOf(AssociatedObjectKey, ExperimentalAssociatedObjects) + object ParameterNames { val value = Name.identifier("value") diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsReflectionAPICallChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsReflectionAPICallChecker.kt index 4b80d603702..262321b7b6c 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsReflectionAPICallChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsReflectionAPICallChecker.kt @@ -41,7 +41,7 @@ class JsReflectionAPICallChecker( context: CallCheckerContext ): Boolean { return super.isAllowedReflectionApi(descriptor, containingClass, context) || - containingClass.classId in StandardClassIds.associatedObjectAnnotations || + containingClass.classId in StandardClassIds.Annotations.associatedObjectAnnotations || descriptor.name == StandardNames.FqNames.findAssociatedObject.shortName() }