Fix without improper waiting IJPL-1005 FUSProjectHotStartUpMeasurer may wrongly report no editors were opened

GitOrigin-RevId: 192b6ec8d1edd52a1607467f17aae6f0991925fc
This commit is contained in:
Elena Shaverdova
2024-04-12 13:55:57 +02:00
committed by intellij-monorepo-bot
parent fa2cdc6fda
commit d131301d1b
2 changed files with 40 additions and 23 deletions

View File

@@ -4,6 +4,7 @@
package com.intellij.openapi.project.impl
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.concurrency.captureThreadContext
import com.intellij.configurationStore.saveSettings
import com.intellij.conversion.CannotConvertException
import com.intellij.diagnostic.StartUpMeasurer
@@ -57,6 +58,7 @@ import com.intellij.toolWindow.computeToolWindowBeans
import com.intellij.ui.ScreenUtil
import com.intellij.util.TimeoutUtil
import kotlinx.coroutines.*
import kotlinx.coroutines.Runnable
import org.jetbrains.annotations.ApiStatus
import java.awt.Dimension
import java.awt.Frame
@@ -204,25 +206,29 @@ internal class ProjectUiFrameAllocator(
launch {
val project = rawProjectDeferred.await()
val startUpContextElementToPass = FUSProjectHotStartUpMeasurer.getStartUpContextElementToPass() ?: EmptyCoroutineContext
val onNoEditorsLeft = blockingContext {
captureThreadContext(Runnable { FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime()) })
}
@Suppress("UsagesOfObsoleteApi")
(project as ComponentManagerEx).getCoroutineScope().launch(startUpContextElementToPass + rootTask()) {
try {
launch {
val frameHelper = deferredProjectFrameHelper.await()
frameHelper.installDefaultProjectStatusBarWidgets(project)
frameHelper.updateTitle(serviceAsync<FrameTitleBuilder>().getProjectTitle(project), project)
}
reopeningEditorJob.join()
postOpenEditors(
deferredProjectFrameHelper = deferredProjectFrameHelper,
fileEditorManager = project.serviceAsync<FileEditorManager>() as FileEditorManagerImpl,
toolWindowInitJob = toolWindowInitJob,
project = project,
)
launch {
val frameHelper = deferredProjectFrameHelper.await()
frameHelper.installDefaultProjectStatusBarWidgets(project)
frameHelper.updateTitle(serviceAsync<FrameTitleBuilder>().getProjectTitle(project), project)
}
finally {
FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime())
reopeningEditorJob.join()
postOpenEditors(
deferredProjectFrameHelper = deferredProjectFrameHelper,
fileEditorManager = project.serviceAsync<FileEditorManager>() as FileEditorManagerImpl,
toolWindowInitJob = toolWindowInitJob,
project = project,
)
}.invokeOnCompletion { throwable ->
if (throwable != null) {
onNoEditorsLeft.run()
}
}
}
@@ -427,6 +433,9 @@ private suspend fun postOpenEditors(
openProjectViewIfNeeded(project, toolWindowInitJob)
findAndOpenReadmeIfNeeded(project)
}
blockingContext {
FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime())
}
}
}
@@ -438,9 +447,12 @@ private suspend fun focusSelectedEditor(editorComponent: EditorsSplitters) {
composite.preferredFocusedComponent?.requestFocusInWindow()
}
else {
AsyncEditorLoader.waitForLoaded(textEditor.editor)
FUSProjectHotStartUpMeasurer.firstOpenedEditor(composite.file)
composite.preferredFocusedComponent?.requestFocusInWindow()
blockingContext {
AsyncEditorLoader.performWhenLoaded(textEditor.editor) {
FUSProjectHotStartUpMeasurer.firstOpenedEditor(composite.file)
composite.preferredFocusedComponent?.requestFocusInWindow()
}
}
}
}

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.ide.diagnostic.startUpPerformanceReporter
import com.intellij.concurrency.currentThreadContext
import com.intellij.diagnostic.StartUpMeasurer
import com.intellij.ide.impl.ProjectUtilCore
import com.intellij.idea.IdeStarter
@@ -197,8 +198,10 @@ object FUSProjectHotStartUpMeasurer {
channel.trySend(Event.MarkupRestoredEvent(file.id))
}
suspend fun firstOpenedEditor(file: VirtualFile) {
if (!isProperContext()) return
fun firstOpenedEditor(file: VirtualFile) {
if (!currentThreadContext().isProperContext()) {
return
}
channel.trySend(Event.FirstEditorEvent(SourceOfSelectedEditor.TextEditor, file, System.nanoTime()))
}
@@ -212,8 +215,10 @@ object FUSProjectHotStartUpMeasurer {
channel.trySend(Event.FirstEditorEvent(SourceOfSelectedEditor.FoundReadmeFile, readmeFile, nanoTime))
}
suspend fun reportNoMoreEditorsOnStartup(nanoTime: Long) {
if (!isProperContext()) return
fun reportNoMoreEditorsOnStartup(nanoTime: Long) {
if (!currentThreadContext().isProperContext()) {
return
}
channel.trySend(Event.NoMoreEditorsEvent(nanoTime))
}