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).