From 445c0deb61919f7f23f75028594e7e62ebcfb016 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 1 Jul 2022 16:34:26 +0200 Subject: [PATCH] [Analysis] fix race in registering services in test --- .../configurators/AnalysisApiTestConfigurator.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt index 8785e78ab2e..259eb849fe1 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt @@ -55,24 +55,25 @@ abstract class AnalysisApiTestConfigurator { } } -private object ApplicationServiceRegistrar { +object ApplicationServiceRegistrar { fun register(application: MockApplication, registrars: List, testServices: TestServices) { + val lock = application.lock for (registrar in registrars) { - val registered = application.lock.readLock().withLock { - application.serviceRegistered[registrar::class] == true - } - - if (registered) { + if (lock.readLock().withLock { application.isRegistrarRegistered(registrar) }) { continue } - application.lock.writeLock().withLock { + lock.writeLock().withLock { + if (application.isRegistrarRegistered(registrar)) return@withLock registrar.registerApplicationServices(application, testServices) application.serviceRegistered[registrar::class] = true } } } + private fun Application.isRegistrarRegistered(registrar: AnalysisApiTestServiceRegistrar): Boolean = + serviceRegistered[registrar::class] == true + private val Application.lock by NotNullableUserDataProperty( Key("TestApplicationServicesRegistrarLock"),