RDCT-1642 Reuse withStoredTemporaryContext in ServiceInstanceInitializer.createInstance()

GitOrigin-RevId: 3c77b18e629e5943526a35190bedb87858961910
This commit is contained in:
Artem.Bukhonov
2024-08-29 16:53:11 +02:00
committed by intellij-monorepo-bot
parent fcc8602b58
commit b95156e1dd
2 changed files with 5 additions and 5 deletions

View File

@@ -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 <T> 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 <T> withStoredTemporaryContext(parentScope: CoroutineScope, action: () -> T): T {
@ApiStatus.Internal
suspend fun <T> 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.

View File

@@ -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)
}
}