Skip to content

Commit 379b1ec

Browse files
authored
Fix deadlock in CodeWhispererStatusBarWidget (#4967)
`CodeWhispererStatusBarWidget#getSelectedValue` is called under EDT, but may cause `ProfileWatcher` to be indirectly initialized on the background through `ToolkitConnectionManager#activeConnectionForFeature`. However `ProfileWatcher` requires EDT to initialize correctly since it relies on VFS events to propagate on EDT before it returns
1 parent bae4f07 commit 379b1ec

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix an IDE deadlock that may occur while attempting to initialize Amazon Q UI elements (#4966)"
4+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/status/CodeWhispererStatusBarWidget.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.intellij.ui.AnimatedIcon
1919
import com.intellij.util.Consumer
2020
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
2121
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
22+
import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileWatcher
2223
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
2324
import software.aws.toolkits.jetbrains.services.amazonq.gettingstarted.QActionGroups.Q_SIGNED_OUT_ACTION_GROUP
2425
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomizationListener
@@ -104,11 +105,16 @@ class CodeWhispererStatusBarWidget(project: Project) :
104105
)
105106
}
106107

107-
override fun getSelectedValue(): String = CodeWhispererModelConfigurator.getInstance().activeCustomization(project).let {
108-
if (it == null) {
109-
message("codewhisperer.statusbar.display_name")
110-
} else {
111-
"${message("codewhisperer.statusbar.display_name")} | ${it.name}"
108+
override fun getSelectedValue(): String {
109+
// HACK: Force ProfileWatcher to load under EDT so that ToolkitConnectionManager#activeConnectionForFeature does not deadlock while ProfileWatcher#<init>
110+
// is waiting for VFS events to propagate on EDT
111+
ProfileWatcher.getInstance()
112+
return CodeWhispererModelConfigurator.getInstance().activeCustomization(project).let {
113+
if (it == null) {
114+
message("codewhisperer.statusbar.display_name")
115+
} else {
116+
"${message("codewhisperer.statusbar.display_name")} | ${it.name}"
117+
}
112118
}
113119
}
114120

0 commit comments

Comments
 (0)