Move FastJarFileSystem to ProjectEnvironment and link to the root disposable

This commit is contained in:
Denis.Zharkov
2021-07-22 16:25:32 +03:00
committed by TeamCityServer
parent 3afed7f972
commit d6adac8dd0
7 changed files with 52 additions and 32 deletions
@@ -93,7 +93,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
configuration.put(CommonConfigurationKeys.MODULE_NAME, "repl.kts") configuration.put(CommonConfigurationKeys.MODULE_NAME, "repl.kts")
val environment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration) val environment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration)
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(rootDisposable, environment) val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(rootDisposable, environment, configuration)
projectEnv.registerExtensionsFromPlugins(configuration) projectEnv.registerExtensionsFromPlugins(configuration)
val scriptingEvaluators = ScriptEvaluationExtension.getInstances(projectEnv.project) val scriptingEvaluators = ScriptEvaluationExtension.getInstances(projectEnv.project)
@@ -89,7 +89,8 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
val projectEnvironment = val projectEnvironment =
KotlinCoreEnvironment.ProjectEnvironment( KotlinCoreEnvironment.ProjectEnvironment(
rootDisposable, rootDisposable,
KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration) KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration),
configuration
) )
projectEnvironment.registerExtensionsFromPlugins(configuration) projectEnvironment.registerExtensionsFromPlugins(configuration)
@@ -115,10 +115,47 @@ class KotlinCoreEnvironment private constructor(
class ProjectEnvironment( class ProjectEnvironment(
disposable: Disposable, disposable: Disposable,
applicationEnvironment: KotlinCoreApplicationEnvironment applicationEnvironment: KotlinCoreApplicationEnvironment,
configuration: CompilerConfiguration
) : ) :
KotlinCoreProjectEnvironment(disposable, applicationEnvironment) { KotlinCoreProjectEnvironment(disposable, applicationEnvironment) {
internal val jarFileSystem: VirtualFileSystem
init {
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
if (configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM)) {
messageCollector?.report(
STRONG_WARNING,
"Using new faster version of JAR FS: it should make your build faster, but the new implementation is experimental"
)
}
jarFileSystem = when {
configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM) || configuration.getBoolean(CommonConfigurationKeys.USE_FIR) -> {
val fastJarFs = FastJarFileSystem.createIfUnmappingPossible()
if (fastJarFs == null) {
messageCollector?.report(
STRONG_WARNING,
"Your JDK doesn't seem to support mapped buffer unmapping, so the slower (old) version of JAR FS will be used"
)
applicationEnvironment.jarFileSystem
} else {
Disposer.register(disposable) {
fastJarFs.clearHandlersCache()
}
fastJarFs
}
}
else -> applicationEnvironment.jarFileSystem
}
}
private var extensionRegistered = false private var extensionRegistered = false
override fun preregisterServices() { override fun preregisterServices() {
@@ -159,7 +196,8 @@ class KotlinCoreEnvironment private constructor(
val configuration: CompilerConfiguration = initialConfiguration.apply { setupJdkClasspathRoots(configFiles) }.copy() val configuration: CompilerConfiguration = initialConfiguration.apply { setupJdkClasspathRoots(configFiles) }.copy()
private val jarFileSystem: VirtualFileSystem private val jarFileSystem: VirtualFileSystem =
(projectEnvironment as? ProjectEnvironment)?.jarFileSystem ?: applicationEnvironment.jarFileSystem
init { init {
PersistentFSConstants::class.java.getDeclaredField("ourMaxIntellisenseFileSize") PersistentFSConstants::class.java.getDeclaredField("ourMaxIntellisenseFileSize")
@@ -177,24 +215,6 @@ class KotlinCoreEnvironment private constructor(
) )
} }
jarFileSystem = when {
configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM) || configuration.getBoolean(CommonConfigurationKeys.USE_FIR) -> {
val fastJarFs = FastJarFileSystem.createIfUnmappingPossible()
if (fastJarFs == null) {
messageCollector?.report(
STRONG_WARNING,
"Your JDK doesn't seem to support mapped buffer unmapping, so the slower (old) version of JAR FS will be used"
)
applicationEnvironment.jarFileSystem
} else {
fastJarFs
}
}
else -> applicationEnvironment.jarFileSystem
}
(projectEnvironment as? ProjectEnvironment)?.registerExtensionsFromPlugins(configuration) (projectEnvironment as? ProjectEnvironment)?.registerExtensionsFromPlugins(configuration)
// otherwise consider that project environment is properly configured before passing to the environment // otherwise consider that project environment is properly configured before passing to the environment
// TODO: consider some asserts to check important extension points // TODO: consider some asserts to check important extension points
@@ -455,7 +475,7 @@ class KotlinCoreEnvironment private constructor(
): KotlinCoreEnvironment { ): KotlinCoreEnvironment {
setupIdeaStandaloneExecution() setupIdeaStandaloneExecution()
val appEnv = getOrCreateApplicationEnvironmentForProduction(parentDisposable, configuration) val appEnv = getOrCreateApplicationEnvironmentForProduction(parentDisposable, configuration)
val projectEnv = ProjectEnvironment(parentDisposable, appEnv) val projectEnv = ProjectEnvironment(parentDisposable, appEnv, configuration)
val environment = KotlinCoreEnvironment(projectEnv, configuration, configFiles) val environment = KotlinCoreEnvironment(projectEnv, configuration, configFiles)
synchronized(APPLICATION_LOCK) { synchronized(APPLICATION_LOCK) {
@@ -487,7 +507,7 @@ class KotlinCoreEnvironment private constructor(
val configuration = initialConfiguration.copy() val configuration = initialConfiguration.copy()
// Tests are supposed to create a single project and dispose it right after use // Tests are supposed to create a single project and dispose it right after use
val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true) val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true)
val projectEnv = ProjectEnvironment(parentDisposable, appEnv) val projectEnv = ProjectEnvironment(parentDisposable, appEnv, configuration)
return KotlinCoreEnvironment(projectEnv, configuration, extensionConfigs) return KotlinCoreEnvironment(projectEnv, configuration, extensionConfigs)
} }
@@ -502,7 +522,7 @@ class KotlinCoreEnvironment private constructor(
@TestOnly @TestOnly
fun createProjectEnvironmentForTests(parentDisposable: Disposable, configuration: CompilerConfiguration): ProjectEnvironment { fun createProjectEnvironmentForTests(parentDisposable: Disposable, configuration: CompilerConfiguration): ProjectEnvironment {
val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true) val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true)
return ProjectEnvironment(parentDisposable, appEnv) return ProjectEnvironment(parentDisposable, appEnv, configuration)
} }
// used in the daemon for jar cache cleanup // used in the daemon for jar cache cleanup
@@ -557,7 +577,6 @@ class KotlinCoreEnvironment private constructor(
ourApplicationEnvironment = null ourApplicationEnvironment = null
Disposer.dispose(environment.parentDisposable) Disposer.dispose(environment.parentDisposable)
ZipHandler.clearFileAccessorCache() ZipHandler.clearFileAccessorCache()
(environment.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache()
} }
} }
@@ -1204,7 +1204,6 @@ class CompileServiceImpl(
override fun clearJarCache() { override fun clearJarCache() {
ZipHandler.clearFileAccessorCache() ZipHandler.clearFileAccessorCache()
(KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache() (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache()
(KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache()
} }
private inline fun <R> ifAlive( private inline fun <R> ifAlive(
@@ -66,7 +66,8 @@ abstract class KotlinJvmReplServiceBase(
val projectEnvironment = val projectEnvironment =
KotlinCoreEnvironment.ProjectEnvironment( KotlinCoreEnvironment.ProjectEnvironment(
disposable, disposable,
KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(disposable, configuration) KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(disposable, configuration),
configuration,
) )
ReplFactoryExtension.registerExtensionPoint(projectEnvironment.project) ReplFactoryExtension.registerExtensionPoint(projectEnvironment.project)
projectEnvironment.registerExtensionsFromPlugins(configuration) projectEnvironment.registerExtensionsFromPlugins(configuration)
@@ -670,7 +670,6 @@ class CompileServiceServerSideImpl(
override suspend fun clearJarCache() { override suspend fun clearJarCache() {
ZipHandler.clearFileAccessorCache() ZipHandler.clearFileAccessorCache()
(KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache() (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache()
(KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache()
} }
private suspend fun <R> ifAlive( private suspend fun <R> ifAlive(
@@ -84,12 +84,13 @@ open class CompilerConfigurationProviderImpl(
ApplicationEnvironmentDisposer.ROOT_DISPOSABLE, ApplicationEnvironmentDisposer.ROOT_DISPOSABLE,
CompilerConfiguration() CompilerConfiguration()
) )
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment) val initialConfiguration = createCompilerConfiguration(module)
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment, initialConfiguration)
val project = projectEnv.project val project = projectEnv.project
configurators.forEach { it.registerCompilerExtensions(project) } configurators.forEach { it.registerCompilerExtensions(project) }
return KotlinCoreEnvironment.createForTests( return KotlinCoreEnvironment.createForTests(
projectEnv, projectEnv,
createCompilerConfiguration(module), initialConfiguration,
configFiles configFiles
) )
} }