Deadlock problem in Vehicle Editor

I am running Ubuntu 10.10, JDK 1.6.0_24 with JMP alpha4 with the latest nightly updates installed.



When opening a model in the Vehicle Editor, I keep hitting a deadlock that is detectable by JConsole:


Name: LWJGL Renderer Thread
State: BLOCKED on java.awt.Component$AWTTreeLock@7e159698 owned by: AWT-EventQueue-1
Total blocked: 24 Total waited: 63,548

Stack trace:
java.awt.Container.getComponentZOrder(Container.java:894)
javax.swing.LayoutComparator.compare(LayoutComparator.java:100)
java.util.Arrays.mergeSort(Arrays.java:1270)
java.util.Arrays.mergeSort(Arrays.java:1282)
java.util.Arrays.mergeSort(Arrays.java:1281)
java.util.Arrays.sort(Arrays.java:1210)
java.util.Collections.sort(Collections.java:159)
javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(SortingFocusTraversalPolicy.java:119)
javax.swing.SortingFocusTraversalPolicy.getComponentAfter(SortingFocusTraversalPolicy.java:244)
javax.swing.LayoutFocusTraversalPolicy.getComponentAfter(LayoutFocusTraversalPolicy.java:88)
java.awt.Component.preNextFocusHelper(Component.java:7663)
java.awt.Component.nextFocusHelper(Component.java:7642)
java.awt.Component.doAutoTransfer(Component.java:7574)
java.awt.Component.autoTransferFocus(Component.java:7557)
java.awt.Component.setFocusable(Component.java:6904)
org.lwjgl.opengl.LinuxDisplay.setFocused(LinuxDisplay.java:904)
org.lwjgl.opengl.LinuxDisplay.processEvents(LinuxDisplay.java:761)
org.lwjgl.opengl.LinuxDisplay.update(LinuxDisplay.java:796)
org.lwjgl.opengl.Display.processMessages(Display.java:634)
- locked java.lang.Object@531d491f
org.lwjgl.opengl.Display.update(Display.java:692)
- locked java.lang.Object@531d491f
org.lwjgl.opengl.Display.update(Display.java:662)
com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:145)
com.jme3.system.lwjgl.LwjglCanvas.runLoop(LwjglCanvas.java:191)
com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:206)
java.lang.Thread.run(Thread.java:662)

Name: AWT-EventQueue-1
State: WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@79d24541 owned by: LWJGL Renderer Thread
Total blocked: 1,541 Total waited: 2,149

Stack trace:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
sun.awt.SunToolkit.awtLock(SunToolkit.java:236)
sun.awt.X11.XDecoratedPeer.getLocationOnScreen(XDecoratedPeer.java:968)
java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1961)
java.awt.Component.getLocationOnScreen(Component.java:1939)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.SwingUtilities.convertPointToScreen(SwingUtilities.java:364)
org.netbeans.core.windows.view.EditorView.getPureBounds(EditorView.java:95)
org.netbeans.core.windows.view.ViewHierarchy.getPureEditorAreaBounds(ViewHierarchy.java:914)
org.netbeans.core.windows.view.DefaultView.guessSlideSide(DefaultView.java:120)
org.netbeans.core.windows.ViewRequestor.guessSlideSide(ViewRequestor.java:113)
org.netbeans.core.windows.Central.guessSlideSide(Central.java:1815)
org.netbeans.core.windows.WindowManagerImpl.guessSlideSide(WindowManagerImpl.java:908)
org.netbeans.core.windows.view.ui.tabcontrol.TabbedAdapter$WinsysInfo.getOrientation(TabbedAdapter.java:534)
org.netbeans.swing.tabcontrol.plaf.TabControlButtonFactory$SlidePinButton.getButtonId(TabControlButtonFactory.java:165)
org.netbeans.swing.tabcontrol.plaf.TabControlButton.getIcon(TabControlButton.java:134)
javax.swing.plaf.synth.SynthButtonUI.getIcon(SynthButtonUI.java:263)
javax.swing.plaf.synth.SynthButtonUI.paint(SynthButtonUI.java:223)
javax.swing.plaf.synth.SynthButtonUI.update(SynthButtonUI.java:206)
javax.swing.JComponent.paintComponent(JComponent.java:752)
javax.swing.JComponent.paint(JComponent.java:1029)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
org.netbeans.swing.tabcontrol.TabbedContainer.paint(TabbedContainer.java:959)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
org.netbeans.core.windows.view.ui.MultiSplitPane.paint(MultiSplitPane.java:330)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
org.netbeans.core.windows.view.ui.MultiSplitPane.paint(MultiSplitPane.java:330)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
javax.swing.JComponent.paintChildren(JComponent.java:862)
- locked java.awt.Component$AWTTreeLock@7e159698
javax.swing.JComponent.paint(JComponent.java:1038)
javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
javax.swing.RepaintManager.paint(RepaintManager.java:1224)
javax.swing.JComponent._paintImmediately(JComponent.java:5072)
javax.swing.JComponent.paintImmediately(JComponent.java:4882)
javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:642)
java.awt.EventQueue.access$000(EventQueue.java:85)
java.awt.EventQueue$1.run(EventQueue.java:603)
java.awt.EventQueue$1.run(EventQueue.java:601)
java.security.AccessController.doPrivileged(Native Method)
java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
java.awt.EventQueue.dispatchEvent(EventQueue.java:612)
org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


It appears to me that the culprit is the bold section below in LwjglAbstractDisplay.runLoop():

[java] protected void runLoop(){
if (!created.get())
throw new IllegalStateException();

listener.update();

if (renderable.get()){
assert checkGLError();

// calls swap buffers, etc.
try {
<strong> if (autoFlush){
Display.update();
}else{
Display.processMessages();
Thread.sleep(50);
// add a small wait
// to reduce CPU usage
}</strong>
} catch (Throwable ex){
listener.handleError("Error while swapping buffers", ex);
}
}

if (frameRate > 0)
Display.sync(frameRate);

if (renderable.get() && autoFlush)
renderer.onFrame();
}[/java]

Since this section of code ultimately calls Swing and AWT code, it needs to be executed in a Swing thread via SwingUtilities. invokeLater(Runnable doRun).

Oops. Looks like one cannot use strong tags inside a java block.

That’s quite odd… It’s not supposed to call any AWT code. I’ll have to confirm this with LWJGL

Actually, the deadlock doesn’t appear to be related to the Vehicle Editor at all. I’ve been able to produce the same deadlock just by starting JMP and leaving it idle for a short time.

Any news on this?

Because my JMP still freezes. :frowning: