From b95156e1ddc61f1b5d694a62abc91e0902a92a97 Mon Sep 17 00:00:00 2001 From: "Artem.Bukhonov" Date: Thu, 29 Aug 2024 16:53:11 +0200 Subject: [PATCH] RDCT-1642 Reuse withStoredTemporaryContext in ServiceInstanceInitializer.createInstance() GitOrigin-RevId: 3c77b18e629e5943526a35190bedb87858961910 --- platform/instanceContainer/src/instantiation/instantiate.kt | 5 +++-- .../intellij/serviceContainer/ServiceInstanceInitializer.kt | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/instanceContainer/src/instantiation/instantiate.kt b/platform/instanceContainer/src/instantiation/instantiate.kt index e14b1cab9a60..33be42618cbe 100644 --- a/platform/instanceContainer/src/instantiation/instantiate.kt +++ b/platform/instanceContainer/src/instantiation/instantiate.kt @@ -7,11 +7,11 @@ import com.intellij.platform.util.coroutines.childScope import com.intellij.util.ArrayUtilRt import com.intellij.util.containers.toArray import kotlinx.coroutines.* +import org.jetbrains.annotations.ApiStatus import java.lang.invoke.MethodHandle import java.lang.invoke.MethodHandles import java.lang.invoke.MethodType import java.lang.reflect.Constructor -import kotlin.coroutines.CoroutineContext /** * Instantiates [instanceClass] using [resolver] to find instances for constructor parameter types. @@ -317,7 +317,8 @@ private suspend fun instantiate( // we don't want it to be captured by lambdas scheduled in the constructor (= context propagation). // Only the context of the owner coroutine should be captured. // TODO Put BlockingJob to bind all computations started in instance constructor to instance scope. -private suspend fun withStoredTemporaryContext(parentScope: CoroutineScope, action: () -> T): T { +@ApiStatus.Internal +suspend fun withStoredTemporaryContext(parentScope: CoroutineScope, action: () -> T): T { val existingCoroutineContext = currentCoroutineContext() val scopeContext = parentScope.coroutineContext // `temporaryCoroutineContext` belongs to the initialization processes throughout the whole chain of initialization. diff --git a/platform/service-container/src/com/intellij/serviceContainer/ServiceInstanceInitializer.kt b/platform/service-container/src/com/intellij/serviceContainer/ServiceInstanceInitializer.kt index dc82774160d0..cfb95e2eead7 100644 --- a/platform/service-container/src/com/intellij/serviceContainer/ServiceInstanceInitializer.kt +++ b/platform/service-container/src/com/intellij/serviceContainer/ServiceInstanceInitializer.kt @@ -1,7 +1,6 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.serviceContainer -import com.intellij.concurrency.installTemporaryThreadContext import com.intellij.diagnostic.PluginException import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager @@ -14,9 +13,9 @@ import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.util.Disposer import com.intellij.platform.instanceContainer.instantiation.InstantiationException import com.intellij.platform.instanceContainer.instantiation.instantiate +import com.intellij.platform.instanceContainer.instantiation.withStoredTemporaryContext import com.intellij.platform.instanceContainer.internal.InstanceInitializer import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.currentCoroutineContext import java.util.concurrent.CancellationException internal abstract class ServiceInstanceInitializer( @@ -66,7 +65,7 @@ internal abstract class ServiceInstanceInitializer( // which happens only on project/application shutdown, or on plugin unload. Cancellation.withNonCancelableSection().use { // loadState may invokeLater => don't capture the context - installTemporaryThreadContext(currentCoroutineContext()).use { + withStoredTemporaryContext(parentScope) { componentManager.initializeService(instance, serviceDescriptor, pluginId) } }