diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt index 07916982163..8b14f66551f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/ThreadLocalDelegate.kt @@ -5,13 +5,19 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.utils +import java.util.concurrent.ConcurrentHashMap import kotlin.reflect.KProperty -internal class ThreadLocalValue(private val threadLocal: ThreadLocal) { +internal class ThreadLocalValue(private val init: () -> V) { + private val map = ConcurrentHashMap() + @Suppress("NOTHING_TO_INLINE") - inline operator fun getValue(thisRef: Any?, property: KProperty<*>): V = threadLocal.get() + inline operator fun getValue(thisRef: Any?, property: KProperty<*>): V = + map.computeIfAbsent(Thread.currentThread().id) { + init() + } } -internal inline fun threadLocal(crossinline init: () -> T): ThreadLocalValue = - ThreadLocalValue(ThreadLocal.withInitial { init() }) +internal fun threadLocal(init: () -> V): ThreadLocalValue = + ThreadLocalValue(init)