Test background:
----------------
I am running an application that opens up a Frame/Dialog/Window in which a volatile image is rendered. I am running this app on a multi-monitor (2 monitors) virtual screen WinXP configuration. This frame is initially created on one of the screens and then moved to another screen after it is made visible. Actually this test expects the volatile image to get invalidated and re-created (IMAGE_INCOMPATIBLE) when it is moved from one GD to the other.
Behavior Seen:
--------------
Application is moved by calling setLocation() repeatedly with increasing or decreasing x,y value depending on the virtual config being horizontal or vertical. On Mustang-b51+, the frame stays in-between the two screens and it freezes. I don't see any IMAGE_INCOMPATIBLE being returned when the VImage is validated.
This is noticed only on Mustang-b51 and I am not able to reproduce it on b50. This is seen only on WinXP (Platform Info is given under Comments section) and passes on Linux + Xinerama. Hence looks like this is a regression introduced in b51.
I have attached a sample test and couple of other supporting files, images. Please run the test on the primary screen as follows:
java MoveWindowVirtualScreenTest
This will show an undecorated frame on the sec screen and will move it to the primary. Check the renderings are proper. If you see frame getting stuck in-between the 2 monitors, the bug is reproduced. Also check whether 'IMAGE_INCOMPATIBLE' message is shown on the console.
(This test will loop through all the GCs for each GD, all the GDs, Window, Frame (decorated/undecorated) and Dialog top levels). This occurs intermittently. I reproduced it 7 times out of 10 trials. So run the app a few times if you don't see it the first time.
Here is the thread dump at the time of hang:
--------------------------------------------
Full thread dump Java HotSpot(TM) Client VM (1.6.0-ea-b52 mixed mode):
"AWT-EventQueue-0" prio=7 tid=0x0ad29500 nid=0xe10 waiting for monitor entry [0x0be8f000..0x0be8fd14]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.awt.Component.setGCFromPeer(Component.java:948)
- waiting to lock <0x02e3cbc0> (a java.awt.Component$AWTTreeLock)
at java.awt.Window.resetGC(Window.java:2532)
at sun.awt.windows.WWindowPeer.resetTargetGC(Native Method)
at sun.awt.windows.WCanvasPeer.displayChanged(WCanvasPeer.java:48)
at sun.awt.windows.WPanelPeer.displayChanged(WPanelPeer.java:142)
at sun.awt.windows.WWindowPeer.displayChanged(WWindowPeer.java:292)
at sun.awt.windows.WWindowPeer$1.run(WWindowPeer.java:235)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
"AWT-Shutdown" prio=5 tid=0x0adcad00 nid=0xba0 in Object.wait() [0x0bd1f000..0x0bd1fd94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e385e8> (a java.lang.Object)
at java.lang.Object.wait(Object.java:484)
at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)
- locked <0x02e385e8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:611)
"AWT-Windows" daemon prio=7 tid=0x0ad29900 nid=0xa3c runnable [0x0bb1f000..0x0bb1fa94]
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WToolkit.eventLoop(Native Method)
at sun.awt.windows.WToolkit.run(WToolkit.java:290)
at java.lang.Thread.run(Thread.java:611)
"Java2D Disposer" daemon prio=10 tid=0x0ad22800 nid=0x33c in Object.wait() [0x0ba9f000..0x0ba9fb94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e38678> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x02e38678> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at sun.java2d.Disposer.run(Disposer.java:123)
at java.lang.Thread.run(Thread.java:611)
"Low Memory Detector" daemon prio=5 tid=0x0aac9300 nid=0xc64 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x0aac6d00 nid=0x814 waiting on condition [0x00000000..0x0ac4f740]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x0aac5e00 nid=0x228 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x0aac5300 nid=0x2c8 waiting on condition [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=9 tid=0x0aab9000 nid=0xbf4 in Object.wait() [0x0ab8f000..0x0ab8fa94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e388a8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x02e388a8> (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=0x0aab4f00 nid=0xd20 in Object.wait() [0x0ab4f000..0x0ab4fb14]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e38930> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:484)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x02e38930> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=0x00036f00 nid=0x7f0 runnable [0x0007f000..0x0007fc34]
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WComponentPeer.reshape(Native Method)
- locked <0x02fc1920> (a sun.awt.windows.WFramePeer)
at sun.awt.windows.WFramePeer.reshape(WFramePeer.java:51)
at sun.awt.windows.WComponentPeer.setBounds(WComponentPeer.java:129)
at java.awt.Component.reshapeNativePeer(Component.java:2042)
at java.awt.Component.reshape(Component.java:1990)
- locked <0x02e3cbc0> (a java.awt.Component$AWTTreeLock)
at java.awt.Window.reshape(Window.java:657)
at java.awt.Component.setBounds(Component.java:1956)
at java.awt.Window.setBounds(Window.java:2821)
- locked <0x02e3cbc0> (a java.awt.Component$AWTTreeLock)
at java.awt.Component.move(Component.java:1825)
- locked <0x02e3cbc0> (a java.awt.Component$AWTTreeLock)
at java.awt.Component.setLocation(Component.java:1814)
at MoveWindowVirtualScreenTest.moveWindow(MoveWindowVirtualScreenTest.java:207)
at MoveWindowVirtualScreenTest.createWindow(MoveWindowVirtualScreenTest.java:145)
at MoveWindowVirtualScreenTest.<init>(MoveWindowVirtualScreenTest.java:50)
at MoveWindowVirtualScreenTest.main(MoveWindowVirtualScreenTest.java:68)
"VM Thread" prio=10 tid=0x0aab0900 nid=0xb1c runnable
"VM Periodic Task Thread" prio=10 tid=0x0aaca600 nid=0x900 waiting on condition
JNI global references: 799