Use ReentrantLock instead of ReadWriteLock as a more cheaper alternative more suitable to usage pattern

This commit is contained in:
Alexey Kudravtsev
2019-10-08 18:19:36 +03:00
parent b6a1154672
commit 9c1e59c720
@@ -25,7 +25,6 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.diagnostic.ControlFlowException import com.intellij.openapi.diagnostic.ControlFlowException
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.fileTypes.FileTypeManager import com.intellij.openapi.fileTypes.FileTypeManager
@@ -48,7 +47,8 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import java.io.File import java.io.File
import java.net.URLClassLoader import java.net.URLClassLoader
import java.util.concurrent.locks.ReentrantReadWriteLock import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
import kotlin.concurrent.write import kotlin.concurrent.write
import kotlin.script.dependencies.Environment import kotlin.script.dependencies.Environment
import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptContents
@@ -68,14 +68,14 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
private val failedContributorsHashes = HashSet<Int>() private val failedContributorsHashes = HashSet<Int>()
private val scriptDefinitionsCacheLock = ReentrantReadWriteLock() private val scriptDefinitionsCacheLock = ReentrantLock()
private val scriptDefinitionsCache = SLRUMap<File, ScriptDefinition>(10, 10) private val scriptDefinitionsCache = SLRUMap<File, ScriptDefinition>(10, 10)
override fun findDefinition(file: File): ScriptDefinition? { override fun findDefinition(file: File): ScriptDefinition? {
if (nonScriptFileName(file.name)) return null if (nonScriptFileName(file.name)) return null
if (!isReady()) return null if (!isReady()) return null
val cached = scriptDefinitionsCacheLock.write { scriptDefinitionsCache.get(file) } val cached = scriptDefinitionsCacheLock.withLock { scriptDefinitionsCache.get(file) }
if (cached != null) return cached if (cached != null) return cached
val virtualFile = VfsUtil.findFileByIoFile(file, true) val virtualFile = VfsUtil.findFileByIoFile(file, true)
@@ -87,7 +87,7 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
super.findDefinition(file) ?: return null super.findDefinition(file) ?: return null
} }
scriptDefinitionsCacheLock.write { scriptDefinitionsCacheLock.withLock {
scriptDefinitionsCache.put(file, definition) scriptDefinitionsCache.put(file, definition)
} }
@@ -187,7 +187,7 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
} }
clearCache() clearCache()
scriptDefinitionsCacheLock.write { scriptDefinitionsCache.clear() } scriptDefinitionsCacheLock.withLock { scriptDefinitionsCache.clear() }
// TODO: clear by script type/definition // TODO: clear by script type/definition
ScriptConfigurationManager.getInstance(project).clearConfigurationCachesAndRehighlight() ScriptConfigurationManager.getInstance(project).clearConfigurationCachesAndRehighlight()