-
Bug
-
Resolution: Fixed
-
P3
-
6u21, 7, 11, 17, 20, 21
-
b21
-
generic
-
generic
Stress test running several tests in separate threads intermittenly hangs with stack trace below.
The problem comes from circular dependency of static initialization of classes Blit / GraphicsPrimitive / GraphicsPrimitiveMgr. Deadlock happens like this:
- one of threads tries to initialize GraphicsPrimitiveMgr and calls static constructor, which calls native method initIDs which causes initialization of Blit in native code of initIDs
- another thread tries to initialize Blit, which causes initialization of GraphicsPrimitiveMgr (due to static constructor)
The code should be changed to avoid this circular dependency.
"Thread-5" prio=10 tid=0x08463000 nid=0x74ea in Object.wait() [0xcf2fc000]
java.lang.Thread.State: RUNNABLE
at sun.java2d.loops.Blit.<clinit>(Blit.java:96)
at sun.java2d.x11.X11SurfaceData.<clinit>(X11SurfaceData.java:225)
at sun.awt.X11GraphicsConfig.<clinit>(X11GraphicsConfig.java:58)
at sun.awt.X11GraphicsDevice.makeDefaultConfiguration(X11GraphicsDevice.java:214)
at sun.awt.X11GraphicsDevice.getDefaultConfiguration(X11GraphicsDevice.java:184)
- locked <0xec06c588> (a java.lang.Object)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:92)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at java.awt.Toolkit$2.run(Toolkit.java:834)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
- locked <0xd0df4d40> (a java.lang.Class for java.awt.Toolkit)
at javasoft.sqe.tests.api.java.awt.Image.ImageFilter.SetPixelsTests.ImageFilter1004(SetPixelsTests.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:406)
at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)
"Thread-2" prio=10 tid=0x084f8000 nid=0x74e7 in Object.wait() [0xcf4e3000]
java.lang.Thread.State: RUNNABLE
at sun.java2d.loops.GraphicsPrimitiveMgr.initIDs(Native Method)
at sun.java2d.loops.GraphicsPrimitiveMgr.<clinit>(GraphicsPrimitiveMgr.java:38)
at sun.java2d.loops.DrawLine.locate(DrawLine.java:37)
at sun.java2d.SurfaceData.makeRenderLoops(SurfaceData.java:699)
at sun.awt.image.BufImgSurfaceData.getSolidLoops(BufImgSurfaceData.java:345)
- locked <0xd1172ec0> (a java.lang.Class for sun.awt.image.BufImgSurfaceData)
at sun.awt.image.BufImgSurfaceData.initSolidLoops(BufImgSurfaceData.java:330)
at sun.awt.image.BufImgSurfaceData.createData(BufImgSurfaceData.java:220)
at sun.awt.image.CachingSurfaceManager.<init>(CachingSurfaceManager.java:156)
at sun.java2d.x11.X11CachingSurfaceManager.<init>(X11CachingSurfaceManager.java:56)
at sun.java2d.SurfaceManagerFactory.createCachingManager(SurfaceManagerFactory.java:36)
at sun.awt.image.SurfaceManager.getManager(SurfaceManager.java:54)
at sun.java2d.SurfaceData.getDestSurfaceData(SurfaceData.java:123)
at sun.java2d.SunGraphicsEnvironment.createGraphics(SunGraphicsEnvironment.java:389)
at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1137)
at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1125)
at javasoft.sqe.tests.api.java.awt.Image.BufferedImage.GetTest.testCase3(GetTest.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:406)
at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)
The problem comes from circular dependency of static initialization of classes Blit / GraphicsPrimitive / GraphicsPrimitiveMgr. Deadlock happens like this:
- one of threads tries to initialize GraphicsPrimitiveMgr and calls static constructor, which calls native method initIDs which causes initialization of Blit in native code of initIDs
- another thread tries to initialize Blit, which causes initialization of GraphicsPrimitiveMgr (due to static constructor)
The code should be changed to avoid this circular dependency.
"Thread-5" prio=10 tid=0x08463000 nid=0x74ea in Object.wait() [0xcf2fc000]
java.lang.Thread.State: RUNNABLE
at sun.java2d.loops.Blit.<clinit>(Blit.java:96)
at sun.java2d.x11.X11SurfaceData.<clinit>(X11SurfaceData.java:225)
at sun.awt.X11GraphicsConfig.<clinit>(X11GraphicsConfig.java:58)
at sun.awt.X11GraphicsDevice.makeDefaultConfiguration(X11GraphicsDevice.java:214)
at sun.awt.X11GraphicsDevice.getDefaultConfiguration(X11GraphicsDevice.java:184)
- locked <0xec06c588> (a java.lang.Object)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:92)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at java.awt.Toolkit$2.run(Toolkit.java:834)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
- locked <0xd0df4d40> (a java.lang.Class for java.awt.Toolkit)
at javasoft.sqe.tests.api.java.awt.Image.ImageFilter.SetPixelsTests.ImageFilter1004(SetPixelsTests.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:406)
at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)
"Thread-2" prio=10 tid=0x084f8000 nid=0x74e7 in Object.wait() [0xcf4e3000]
java.lang.Thread.State: RUNNABLE
at sun.java2d.loops.GraphicsPrimitiveMgr.initIDs(Native Method)
at sun.java2d.loops.GraphicsPrimitiveMgr.<clinit>(GraphicsPrimitiveMgr.java:38)
at sun.java2d.loops.DrawLine.locate(DrawLine.java:37)
at sun.java2d.SurfaceData.makeRenderLoops(SurfaceData.java:699)
at sun.awt.image.BufImgSurfaceData.getSolidLoops(BufImgSurfaceData.java:345)
- locked <0xd1172ec0> (a java.lang.Class for sun.awt.image.BufImgSurfaceData)
at sun.awt.image.BufImgSurfaceData.initSolidLoops(BufImgSurfaceData.java:330)
at sun.awt.image.BufImgSurfaceData.createData(BufImgSurfaceData.java:220)
at sun.awt.image.CachingSurfaceManager.<init>(CachingSurfaceManager.java:156)
at sun.java2d.x11.X11CachingSurfaceManager.<init>(X11CachingSurfaceManager.java:56)
at sun.java2d.SurfaceManagerFactory.createCachingManager(SurfaceManagerFactory.java:36)
at sun.awt.image.SurfaceManager.getManager(SurfaceManager.java:54)
at sun.java2d.SurfaceData.getDestSurfaceData(SurfaceData.java:123)
at sun.java2d.SunGraphicsEnvironment.createGraphics(SunGraphicsEnvironment.java:389)
at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1137)
at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1125)
at javasoft.sqe.tests.api.java.awt.Image.BufferedImage.GetTest.testCase3(GetTest.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:406)
at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)