I tried to reproduce it, first by starting my app 20 times using this
version. Five times I got a gray window.

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

Then the same test on this version, and success all 20 times!

java version "1.8.0_60-ea"
Java(TM) SE Runtime Environment (build 1.8.0_60-ea-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

Now it could be luck that it didnt happen, but I also see what you have
done there, by releasing the awtLock in the XPeerWindow while
getDefaultConfig goes for the other lock that deadlocked.

Thanks for a nice fix!




On Thu, Jul 30, 2015 at 6:41 PM, Alexander Zvegintsev <
alexander.zvegint...@oracle.com> wrote:

> Hi Cristian,
>
> it looks like that I've already fixed this issue as [1]
> Could you please check if the problem is gone with 8u60?
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8129116 Deadlock with
> multimonitor fullscreen windows.
>
> Thanks,
>
> Alexander.
>
> On 07/30/2015 05:23 PM, Christian wrote:
>
>> Sorry if you dont want bug talk here, I just feel that i need to send
>> some information somewhere. I'm talking about
>>
>> https://bugs.openjdk.java.net/browse/JDK-8015471
>>
>> This exact issue happen to me quite frequently. I'm running the below jdk
>> version, but it has happened during 1.7.0 jdks also. The bug is closed as
>> not reproducable.
>>
>> java version "1.8.0_45"
>> Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
>> Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
>>
>> By running jstack -l on the jvm I see these threads in deadlock with each
>> other.
>>
>> "AWT-EventQueue-0" #21 prio=6 os_prio=0 tid=0x00007fa8b05ec800 nid=0x316c
>> waiting on condition [0x00007fa892e4f000]
>>    java.lang.Thread.State: WAITING (parking)
>>         at sun.misc.Unsafe.park(Native Method)
>>         - parking to wait for  <0x00000000f064a248> (a
>> java.util.concurrent.locks.ReentrantLock$NonfairSync)
>>         at
>> java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>>         at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
>>         at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
>>         at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
>>         at
>> java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
>>         at
>> java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
>>         at sun.awt.SunToolkit.awtLock(SunToolkit.java:253)
>>         at sun.awt.X11GraphicsDevice.getConfigVisualId(Native Method)
>>         at
>> sun.awt.X11GraphicsDevice.makeDefaultConfiguration(X11GraphicsDevice.java:235)
>>         at
>> sun.awt.X11GraphicsDevice.getDefaultConfiguration(X11GraphicsDevice.java:227)
>>         - locked <0x00000000f062a418> (a java.lang.Object)
>>         at
>> javax.swing.RepaintManager.getDoubleBufferMaximumSize(RepaintManager.java:1153)
>>         at
>> javax.swing.RepaintManager.getVolatileOffscreenBuffer(RepaintManager.java:1035)
>>         at
>> javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1482)
>>         at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
>>         at javax.swing.JComponent.paint(JComponent.java:1042)
>>         at
>> java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
>>         at
>> sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
>>         at
>> sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
>>         at java.awt.Container.paint(Container.java:1973)
>>         at java.awt.Window.paint(Window.java:3912)
>>         at javax.swing.RepaintManager$4.run(RepaintManager.java:835)
>>         at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
>>         at java.security.AccessController.doPrivileged(Native Method)
>>         at
>> java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
>>         at
>> javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
>>         at
>> javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
>>         at
>> javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
>>         at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
>>         at
>> javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
>>         at
>> java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
>>         at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
>>         at java.awt.EventQueue.access$500(EventQueue.java:97)
>>         at java.awt.EventQueue$3.run(EventQueue.java:709)
>>         at java.awt.EventQueue$3.run(EventQueue.java:703)
>>         at java.security.AccessController.doPrivileged(Native Method)
>>         at
>> java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
>>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
>>         at
>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
>>         at
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
>>         at
>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
>>         at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
>>
>>    Locked ownable synchronizers:
>>         - None
>>
>> "AWT-Shutdown" #22 prio=5 os_prio=0 tid=0x00007fa8b05eb000 nid=0x316b in
>> Object.wait() [0x00007fa892f53000]
>>    java.lang.Thread.State: WAITING (on object monitor)
>>         at java.lang.Object.wait(Native Method)
>>         - waiting on <0x00000000f0649ad8> (a java.lang.Object)
>>         at java.lang.Object.wait(Object.java:502)
>>         at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:295)
>>         - locked <0x00000000f0649ad8> (a java.lang.Object)
>>         at java.lang.Thread.run(Thread.java:745)
>>
>>    Locked ownable synchronizers:
>>         - None
>>
>> "AWT-XAWT" #20 daemon prio=6 os_prio=0 tid=0x00007fa8b05c1000 nid=0x316a
>> waiting for monitor entry [0x00007fa893054000]
>>    java.lang.Thread.State: BLOCKED (on object monitor)
>>         at
>> sun.awt.X11GraphicsDevice.getDefaultConfiguration(X11GraphicsDevice.java:227)
>>         - waiting to lock <0x00000000f062a418> (a java.lang.Object)
>>         at
>> sun.awt.X11.XWindowPeer.checkIfOnNewScreen(XWindowPeer.java:683)
>>         at
>> sun.awt.X11.XDecoratedPeer.handleConfigureNotifyEvent(XDecoratedPeer.java:756)
>>         at sun.awt.X11.XBaseWindow.dispatchEvent(XBaseWindow.java:1135)
>>         at sun.awt.X11.XBaseWindow.dispatchToWindow(XBaseWindow.java:1090)
>>         at sun.awt.X11.XToolkit.dispatchEvent(XToolkit.java:502)
>>         at sun.awt.X11.XToolkit.run(XToolkit.java:611)
>>         at sun.awt.X11.XToolkit.run(XToolkit.java:532)
>>         at java.lang.Thread.run(Thread.java:745)
>>
>>    Locked ownable synchronizers:
>>         - <0x00000000f064a248> (a
>> java.util.concurrent.locks.ReentrantLock$NonfairSync)
>>
>>
>> I noticed a comment from the name Denis Fokin (below) that points out
>> that it is dual-monitor configuration related, and I am also running a
>> dual-monitor setup. Could explain failure to reproduce by others?
>>
>> https://youtrack.jetbrains.com/issue/IDEA-122147
>>
>> From what I can see in source the "AWT-XAWT" thread takes the awt lock in
>> this call frame
>>
>>         at sun.awt.X11.XToolkit.run(XToolkit.java:611)
>>
>> and the "AWT-EventQueue-0" thread is trying to take the very same lock
>> while lazily creating the DefaultConfiguration for the first time.
>>
>> The issue seems to be timing sensitive. I have not been trying to find a
>> place to insert some extra delay to reproduce it every time. But I get it
>> about 10-20% of the times when I start our awt/swing app.
>>
>> If that DefaultConfiguration could be created before AWT-XAWT gets around
>> to dispatching events where it holds the awt lock I believe the issue would
>> not occur.
>>
>> Maybe our code is doing something incorrectly at startup that would make
>> sure that this DefaultConfiguration is not lazily created before the fact,
>> and that explains why this bug has gone unreproducible such a long time by
>> people who know what they're doing?
>>
>> I hope I havent made a fool of myself and this bug is fixed already,
>> taking your time for no good, I know im not running the cutting jdk edge
>> version. I just felt I'd take some time and figure out what actually
>> happens when my app pops up with a gray empty window.
>>
>>
>>
>>
>>
>>
>>
>

Reply via email to