eclipse-platform / eclipse-platform/eclipse.platform
Deadlock starting launch group multiple times
- Dominant language
- Java
- Stars
- 165
- Forks
- 174
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 22
Description
I've started a launch group multiple times quickly and UI froze.
Jstack shows classic deadlock.
```
Found one Java-level deadlock:
=============================
"main":
waiting to lock monitor 0x00007f3bec096b90 (object 0x00000000873f54a0, a java.util.HashMap),
which is held by "Worker-25: Launching Many_Ants"
"Worker-25: Launching Many_Ants":
waiting to lock monitor 0x00007f3bc800af30 (object 0x00000007ff4e4a48, a java.util.HashMap),
which is held by "Worker-10: Launching Many_Ants"
"Worker-10: Launching Many_Ants":
waiting to lock monitor 0x00007f3bec096b90 (object 0x00000000873f54a0, a java.util.HashMap),
which is held by "Worker-25: Launching Many_Ants"
Java stack information for the threads listed above:
===================================================
"main":
at org.eclipse.debug.internal.core.groups.GroupLaunch.isTerminated(GroupLaunch.java:98)
- waiting to lock <0x00000000873f54a0> (a java.util.HashMap)
at org.eclipse.debug.internal.ui.actions.RemoveAllTerminatedAction.isEnabled(RemoveAllTerminatedAction.java:37)
at org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate.update(AbstractRemoveAllActionDelegate.java:93)
at org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate.init(AbstractRemoveAllActionDelegate.java:73)
at org.eclipse.ui.internal.ViewPluginAction.initDelegate(ViewPluginAction.java:52)
at org.eclipse.ui.internal.PluginAction.createDelegate(PluginAction.java:128)
at org.eclipse.ui.internal.PluginAction.selectionChanged(PluginAction.java:262)
at org.eclipse.ui.internal.PartPluginAction.registerSelectionListener(PartPluginAction.java:41)
at org.eclipse.ui.internal.ViewPluginAction.(ViewPluginAction.java:38)
at org.eclipse.ui.internal.ActionDescriptor.createAction(ActionDescriptor.java:262)
at org.eclipse.ui.internal.ActionDescriptor.(ActionDescriptor.java:177)
at org.eclipse.ui.internal.ViewerActionBuilder.createActionDescriptor(ViewerActionBuilder.java:49)
at org.eclipse.ui.internal.PluginActionBuilder.readElement(PluginActionBuilder.java:160)
at org.eclipse.ui.internal.ViewerActionBuilder.readElement(ViewerActionBuilder.java:81)
at org.eclipse.ui.internal.registry.RegistryReader.readElements(RegistryReader.java:123)
at org.eclipse.ui.internal.registry.RegistryReader.readElementChildren(RegistryReader.java:112)
at org.eclipse.ui.internal.PluginActionBuilder.readElement(PluginActionBuilder.java:143)
at org.eclipse.ui.internal.ViewerActionBuilder.readElement(ViewerActionBuilder.java:81)
at org.eclipse.ui.internal.registry.RegistryReader.readElements(RegistryReader.java:123)
at org.eclipse.ui.internal.registry.RegistryReader.readExtension(RegistryReader.java:133)
at org.eclipse.ui.internal.registry.RegistryReader.readRegistry(RegistryReader.java:152)
at org.eclipse.ui.internal.PluginActionBuilder.readContributions(PluginActionBuilder.java:114)
at org.eclipse.ui.internal.ViewerActionBuilder.readViewerContributions(ViewerActionBuilder.java:98)
at org.eclipse.ui.internal.PopupMenuExtender.readStaticActionsFor(PopupMenuExtender.java:491)
at org.eclipse.ui.internal.PopupMenuExtender.addMenuId(PopupMenuExtender.java:229)
at org.eclipse.ui.internal.PopupMenuExtender.(PopupMenuExtender.java:149)
at org.eclipse.ui.internal.PartSite.registerContextMenu(PartSite.java:125)
at org.eclipse.ui.part.PageSite.registerContextMenu(PageSite.java:221)
at org.eclipse.ui.console.TextConsolePage.createControl(TextConsolePage.java:166)
at org.eclipse.ui.internal.console.IOConsolePage.createControl(IOConsolePage.java:59)
at org.eclipse.ui.internal.console.ConsoleView.doCreatePage(ConsoleView.java:388)
at org.eclipse.ui.part.PageBookView.createPage(PageBookView.java:369)
at org.eclipse.ui.part.PageBookView.partActivated(PageBookView.java:693)
at org.eclipse.ui.internal.console.ConsoleView.lambda$0(ConsoleView.java:479)
at org.eclipse.ui.internal.console.ConsoleView$$Lambda/0x0000000035a32e38.run(Unknown Source)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:131)
- locked <0x00000000c4efb378> (a org.eclipse.swt.widgets.RunnableLock)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:5078)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4534)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
at org.eclipse.ui.internal.Workbench$$Lambda/0x0000000035197620.run(Unknown Source)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:193)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.base@25/DirectMethodHandle$Holder)
at java.lang.invoke.LambdaForm$MH/0x000000003504f800.invoke(java.base@25/LambdaForm$MH)
at java.lang.invoke.LambdaForm$MH/0x000000003504fc00.invokeExact_MT(java.base@25/LambdaForm$MH)
at jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(java.base@25/DirectMethodHandleAccessor.java:156)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(java.base@25/DirectMethodHandleAccessor.java:104)
at java.lang.reflect.Method.invoke(java.base@25/Method.java:565)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
at org.eclipse.equinox.launcher.Main.main(Main.java:1387)
"Worker-25: Launching Many_Ants":
at org.eclipse.debug.internal.core.groups.GroupLaunch.launchChanged(GroupLaunch.java:203)
- waiting to lock <0x00000007ff4e4a48> (a java.util.HashMap)
at org.eclipse.debug.internal.core.LaunchManager$LaunchNotifier.run(LaunchManager.java:426)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
at org.eclipse.debug.internal.core.LaunchManager$LaunchNotifier.notify(LaunchManager.java:409)
at org.eclipse.debug.internal.core.LaunchManager.fireUpdate(LaunchManager.java:919)
at org.eclipse.debug.core.Launch.fireChanged(Launch.java:471)
at org.eclipse.debug.core.Launch.addProcess(Launch.java:425)
at org.eclipse.debug.internal.core.groups.GroupLaunch.launchChanged(GroupLaunch.java:218)
- locked <0x00000000873f54a0> (a java.util.HashMap)
at org.eclipse.debug.internal.core.groups.GroupLaunchConfigurationDelegate.launchChild(GroupLaunchConfigurationDelegate.java:175)
at org.eclipse.debug.internal.core.groups.GroupLaunchConfigurationDelegate.launch(GroupLaunchConfigurationDelegate.java:127)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:790)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:701)
at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1051)
at org.eclipse.debug.internal.ui.DebugUIPlugin$1.run(DebugUIPlugin.java:1253)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
"Worker-10: Launching Many_Ants":
at org.eclipse.debug.internal.core.groups.GroupLaunch.launchChanged(GroupLaunch.java:203)
- waiting to lock <0x00000000873f54a0> (a java.util.HashMap)
at org.eclipse.debug.internal.core.LaunchManager$LaunchNotifier.run(LaunchManager.java:426)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
at org.eclipse.debug.internal.core.LaunchManager$LaunchNotifier.notify(LaunchManager.java:409)
at org.eclipse.debug.internal.core.LaunchManager.fireUpdate(LaunchManager.java:919)
at org.eclipse.debug.core.Launch.fireChanged(Launch.java:471)
at org.eclipse.debug.core.Launch.addProcess(Launch.java:425)
at org.eclipse.debug.internal.core.groups.GroupLaunch.launchChanged(GroupLaunch.java:218)
- locked <0x00000007ff4e4a48> (a java.util.HashMap)
at org.eclipse.debug.internal.core.groups.GroupLaunchConfigurationDelegate.launchChild(GroupLaunchConfigurationDelegate.java:175)
at org.eclipse.debug.internal.core.groups.GroupLaunchConfigurationDelegate.launch(GroupLaunchConfigurationDelegate.java:127)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:790)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:701)
at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1051)
at org.eclipse.debug.internal.ui.DebugUIPlugin$1.run(DebugUIPlugin.java:1253)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Found 1 deadlock.
```
Contributor guide
Research direction
Start with org.eclipse.debug.internal.core.groups.GroupLaunch.java, especially isTerminated at line 98 and launchChanged at line 203, then trace the launch path through GroupLaunchConfigurationDelegate.java. Reproduce the issue by starting a launch group multiple times quickly and inspect the lock ordering shown in the jstack. Done means repeated launches no longer deadlock or freeze the UI.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100