Skip to content

call fireChangeViewportEvent from awt Event Thread

Schuhbaeck, Stefan requested to merge fix-gui-deadlock into master

@BZoennchen does that makes sense?

I had the issue that the packaged vadere GUI sometimes stoped after the first simulation step. After looking at the threads via jconsole it seems that fireChangeViewportEvent (marked with ** in first stack trace) will synchronize on the model and the awt event thread will do the same --> deadlock. This only happed for big scenarios for what I saw.

If the fix is correct just merge it :)

Name: Thread-0
State: BLOCKED on java.awt.Component$AWTTreeLock@7d505529 owned by: AWT-EventQueue-0
Total blocked: 1  Total waited: 0

Stack trace: 
java.awt.Component.resize(Component.java:2241)
java.awt.Component.setSize(Component.java:2227)
java.awt.Component.resize(Component.java:2275)
java.awt.Component.setSize(Component.java:2262)
javax.swing.JViewport.setViewSize(JViewport.java:1139)
org.vadere.gui.components.control.ViewportChangeListener.viewportChange(ViewportChangeListener.java:50)
org.vadere.gui.components.model.DefaultModel.notifyViewportListeners(DefaultModel.java:182) - locked org.vadere.gui.onlinevisualization.model.OnlineVisualizationModel@6ce9b79f
** org.vadere.gui.components.model.DefaultModel.fireChangeViewportEvent(DefaultModel.java:268) - locked org.vadere.gui.onlinevisualization.model.OnlineVisualizationModel@6ce9b79f
** org.vadere.gui.onlinevisualization.model.OnlineVisualizationModel.popDrawData(OnlineVisualizationModel.java:143) - locked java.lang.Object@746b397e
org.vadere.gui.onlinevisualization.OnlineVisualization.postUpdate(OnlineVisualization.java:112)
org.vadere.simulator.control.simulation.Simulation.run(Simulation.java:279)
org.vadere.simulator.control.simulation.ScenarioRun.run(ScenarioRun.java:158)
java.lang.Thread.run(Thread.java:834)
Name: AWT-EventQueue-0
State: BLOCKED on org.vadere.gui.onlinevisualization.model.OnlineVisualizationModel@6ce9b79f owned by: Thread-0
Total blocked: 123  Total waited: 433

Stack trace: 
org.vadere.gui.components.model.DefaultModel.setViewportBound(DefaultModel.java:273)  <--- needs lock on Model (not possible see above fireChangeViewportEvent)
org.vadere.gui.components.control.JViewportChangeListener.stateChanged(JViewportChangeListener.java:50)
javax.swing.JViewport.fireStateChanged(JViewport.java:1490)
javax.swing.JViewport.reshape(JViewport.java:954)
java.awt.Component.setBounds(Component.java:2326)
java.awt.Component.setBounds(Component.java:2477)
javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:888)
java.awt.Container.layout(Container.java:1537)
java.awt.Container.doLayout(Container.java:1526)
java.awt.Container.validateTree(Container.java:1722)
java.awt.Container.validate(Container.java:1657) - locked java.awt.Component$AWTTreeLock@7d505529
javax.swing.RepaintManager$3.run(RepaintManager.java:745)
javax.swing.RepaintManager$3.run(RepaintManager.java:743)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:742)
javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1889)
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
java.awt.EventQueue$4.run(EventQueue.java:721)
java.awt.EventQueue$4.run(EventQueue.java:715)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Merge request reports