JDK-6529933 : REG: Deadlock when running a fullscreen test on SuSE 10 with Nvidia
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 7
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: linux_suse_sles_10
  • CPU: x86
  • Submitted: 2007-03-01
  • Updated: 2011-03-08
  • Resolved: 2011-03-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b14Fixed
Related Reports
Duplicate :  
Relates :  
Relates :  
Description
I am launching a test which creates a frame using different GCs available and pushes the frame into fullscreen mode. This is repeated for all GDs as well. When I run this on SuSE10 having Nvidia Geforce FX5900 with the latest Nvidia Driver - 9746, the test hangs immediately after the launch (after bringing up the first fullscreen frame). I pressed CTRL + '\' and the thread dump showed that there is a java level deadlock. I have given the thread dump below.

This is not reproducible on JDK7-b07 but reproducible on JDK7-b08. I tried on another SuSE10 machine with ATI Radeon 9600 and it was throwing a NPE (6529869). Not reproducible on Win32. 

I have attached a sample test. Launch the sample test on the above config and you would notice that the test hangs immediately after the launch.

Here is the thread-dump:
------------------------
Full thread dump Java HotSpot(TM) Client VM (1.7.0-ea-b08 mixed mode):

"AWT-Shutdown" prio=10 tid=0x4a6f9000 nid=0x1a38 in Object.wait() [0x4adca000..0x4adcafc0]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x42354a60> (a java.lang.Object)
        at java.lang.Object.wait(Object.java:485)
        at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:263)
        - locked <0x42354a60> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:619)

"AWT-XAWT" daemon prio=10 tid=0x4a6dd400 nid=0x1a37 waiting for monitor entry [0x4ad79000..0x4ad79f40]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at sun.awt.X11GraphicsDevice.getProxyKeyFor(X11GraphicsDevice.java:70)
        - waiting to lock <0x423f19f8> (a sun.awt.X11GraphicsDevice)
        at sun.awt.X11GraphicsConfig.getProxyKey(X11GraphicsConfig.java:166)
        at sun.java2d.x11.X11SurfaceData.<init>(X11SurfaceData.java:404)
        at sun.java2d.x11.X11SurfaceData$X11WindowSurfaceData.<init>(X11SurfaceData.java:665)
        at sun.java2d.x11.X11SurfaceData.createData(X11SurfaceData.java:370)
        at sun.awt.X11GraphicsConfig.createSurfaceData(X11GraphicsConfig.java:339)
        at sun.awt.X11.XWindow.validateSurface(XWindow.java:1110)
        at sun.awt.X11.XWindow.reshape(XWindow.java:1062)
        at sun.awt.X11.XWindow.reshape(XWindow.java:1043)
        at sun.awt.X11.XContentWindow.setContentBounds(XContentWindow.java:84)
        at sun.awt.X11.XDecoratedPeer.reconfigureContentWindow(XDecoratedPeer.java:585)
        at sun.awt.X11.XDecoratedPeer.handleConfigureNotifyEvent(XDecoratedPeer.java:710)
        at sun.awt.X11.XBaseWindow.dispatchEvent(XBaseWindow.java:1081)
        at sun.awt.X11.XBaseWindow.dispatchToWindow(XBaseWindow.java:1038)
        at sun.awt.X11.XToolkit.dispatchEvent(XToolkit.java:471)
        at sun.awt.X11.XToolkit.run(XToolkit.java:584)
        at sun.awt.X11.XToolkit.run(XToolkit.java:519)
        at java.lang.Thread.run(Thread.java:619)

"Java2D Disposer" daemon prio=10 tid=0x08230000 nid=0x1a36 in Object.wait() [0x4acf9000..0x4acfa0c0]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x423f0478> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
        - locked <0x423f0478> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
        at sun.java2d.Disposer.run(Disposer.java:125)
        at java.lang.Thread.run(Thread.java:619)

"Low Memory Detector" daemon prio=10 tid=0x4a612400 nid=0x1a34 runnable [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x4a610c00 nid=0x1a33 waiting on condition [0x00000000..0x4a854be8]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x4a60f800 nid=0x1a32 waiting on condition [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x4a600800 nid=0x1a31 in Object.wait() [0x4a74f000..0x4a74fe40]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x423f0660> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
        - locked <0x423f0660> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x080a6c00 nid=0x1a30 in Object.wait() [0x4a5fb000..0x4a5fbfc0]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x423f06f0> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x423f06f0> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x08057c00 nid=0x1a2e waiting on condition [0x401f2000..0x401f3298]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x427e8a40> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:745)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1108)
        at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
        at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)        at sun.awt.SunToolkit.awtLock(SunToolkit.java:249)
        at sun.awt.X11.XAwtState.getComponentMouseEntered(XAwtState.java:43)
        at sun.awt.X11.XGlobalCursorManager.findHeavyweightUnderCursor(XGlobalCursorManager.java:135)
        at sun.awt.X11.XGlobalCursorManager.findHeavyweightUnderCursor(XGlobalCursorManager.java:151)
        at sun.awt.GlobalCursorManager._updateCursor(GlobalCursorManager.java:166)
        at sun.awt.GlobalCursorManager.updateCursorImmediately(GlobalCursorManager.java:82)
        at sun.awt.X11.XComponentPeer.updateCursorImmediately(XComponentPeer.java:821)
        at java.awt.Component.updateCursorImmediately(Component.java:2758)
        at java.awt.Component.show(Component.java:1389)
        - locked <0x423f6d70> (a java.awt.Component$AWTTreeLock)
        at java.awt.Window.show(Window.java:846)
        at java.awt.Component.show(Component.java:1414)
        at java.awt.Component.setVisible(Component.java:1367)
        at java.awt.Window.setVisible(Window.java:818)
        at java.awt.GraphicsDevice.setFullScreenWindow(GraphicsDevice.java:242)
        at sun.awt.X11GraphicsDevice.setFullScreenWindow(X11GraphicsDevice.java:314)
        - locked <0x423f19f8> (a sun.awt.X11GraphicsDevice)
        at FullScreenTest.fullScreenSameDevice(FullScreenTest.java:81)
        at FullScreenTest.<init>(FullScreenTest.java:44)
        at FullScreenTest.main(FullScreenTest.java:93)

"VM Thread" prio=10 tid=0x080a3c00 nid=0x1a2f runnable

"VM Periodic Task Thread" prio=10 tid=0x4a613c00 nid=0x1a35 waiting on condition

JNI global references: 792


Found one Java-level deadlock:
=============================
"AWT-XAWT":
  waiting to lock monitor 0x080a7fe4 (object 0x423f19f8, a sun.awt.X11GraphicsDevice),
  which is held by "main"
"main":
  waiting for ownable synchronizer 0x427e8a40, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "AWT-XAWT"

Java stack information for the threads listed above:
===================================================
"AWT-XAWT":
        at sun.awt.X11GraphicsDevice.getProxyKeyFor(X11GraphicsDevice.java:70)
        - waiting to lock <0x423f19f8> (a sun.awt.X11GraphicsDevice)
        at sun.awt.X11GraphicsConfig.getProxyKey(X11GraphicsConfig.java:166)
        at sun.java2d.x11.X11SurfaceData.<init>(X11SurfaceData.java:404)
        at sun.java2d.x11.X11SurfaceData$X11WindowSurfaceData.<init>(X11SurfaceData.java:665)
        at sun.java2d.x11.X11SurfaceData.createData(X11SurfaceData.java:370)
        at sun.awt.X11GraphicsConfig.createSurfaceData(X11GraphicsConfig.java:339)
        at sun.awt.X11.XWindow.validateSurface(XWindow.java:1110)
        at sun.awt.X11.XWindow.reshape(XWindow.java:1062)
        at sun.awt.X11.XWindow.reshape(XWindow.java:1043)
        at sun.awt.X11.XContentWindow.setContentBounds(XContentWindow.java:84)
        at sun.awt.X11.XDecoratedPeer.reconfigureContentWindow(XDecoratedPeer.java:585)
        at sun.awt.X11.XDecoratedPeer.handleConfigureNotifyEvent(XDecoratedPeer.java:710)
        at sun.awt.X11.XBaseWindow.dispatchEvent(XBaseWindow.java:1081)
        at sun.awt.X11.XBaseWindow.dispatchToWindow(XBaseWindow.java:1038)
        at sun.awt.X11.XToolkit.dispatchEvent(XToolkit.java:471)
        at sun.awt.X11.XToolkit.run(XToolkit.java:584)
        at sun.awt.X11.XToolkit.run(XToolkit.java:519)
        at java.lang.Thread.run(Thread.java:619)
"main":
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x427e8a40> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:745)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1108)
        at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
        at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)        at sun.awt.SunToolkit.awtLock(SunToolkit.java:249)
        at sun.awt.X11.XAwtState.getComponentMouseEntered(XAwtState.java:43)
        at sun.awt.X11.XGlobalCursorManager.findHeavyweightUnderCursor(XGlobalCursorManager.java:135)
        at sun.awt.X11.XGlobalCursorManager.findHeavyweightUnderCursor(XGlobalCursorManager.java:151)
        at sun.awt.GlobalCursorManager._updateCursor(GlobalCursorManager.java:166)
        at sun.awt.GlobalCursorManager.updateCursorImmediately(GlobalCursorManager.java:82)
        at sun.awt.X11.XComponentPeer.updateCursorImmediately(XComponentPeer.java:821)
        at java.awt.Component.updateCursorImmediately(Component.java:2758)
        at java.awt.Component.show(Component.java:1389)
        - locked <0x423f6d70> (a java.awt.Component$AWTTreeLock)
        at java.awt.Window.show(Window.java:846)
        at java.awt.Component.show(Component.java:1414)
        at java.awt.Component.setVisible(Component.java:1367)
        at java.awt.Window.setVisible(Window.java:818)
        at java.awt.GraphicsDevice.setFullScreenWindow(GraphicsDevice.java:242)
        at sun.awt.X11GraphicsDevice.setFullScreenWindow(X11GraphicsDevice.java:314)
        - locked <0x423f19f8> (a sun.awt.X11GraphicsDevice)
        at FullScreenTest.fullScreenSameDevice(FullScreenTest.java:81)
        at FullScreenTest.<init>(FullScreenTest.java:44)
        at FullScreenTest.main(FullScreenTest.java:93)

Found 1 deadlock.

Heap
 def new generation   total 960K, used 430K [0x42300000, 0x42400000, 0x427e0000)  eden space 896K,  40% used [0x42300000, 0x4235b968, 0x423e0000)
  from space 64K, 100% used [0x423f0000, 0x42400000, 0x42400000)
  to   space 64K,   0% used [0x423e0000, 0x423e0000, 0x423f0000)
 tenured generation   total 4096K, used 308K [0x427e0000, 0x42be0000, 0x46300000)
   the space 4096K,   7% used [0x427e0000, 0x4282d278, 0x4282d400, 0x42be0000)
 compacting perm gen  total 12288K, used 6227K [0x46300000, 0x46f00000, 0x4a300000)
   the space 12288K,  50% used [0x46300000, 0x46914ff8, 0x46915000, 0x46f00000)
No shared spaces configured.

Comments
EVALUATION Fixed as suggested...
05-04-2007

EVALUATION Likely caused by the fix for: 6205557: Changes to image data should be tracked at a finer granularity which went into b08. The problem is that X11GraphicsDevice.getProxyKeyFor() is a synchronized method (that synchronizes on the device instance). We've found in the past that synchronizing on an X11GraphicsDevice/Config instance can be dangerous as it's prone to deadlocks and other issues (see 6299808, for one example). In this case, there's no reason to synchronize on the device instance; an easy fix would be to instead synchronize on the x11ProxyKepMap itself. I'll let the RE for 6205557 make the final call though...
01-03-2007