eclipse-platform / eclipse-platform/eclipse.platform

Deadlock starting launch group multiple times

Open
#2,846 1 comment 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.