JDK-6578570 : Initiating a drag may lock up X
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 6
  • Priority: P4
  • Status: Closed
  • Resolution: Cannot Reproduce
  • OS: linux
  • CPU: x86
  • Submitted: 2007-07-10
  • Updated: 2011-02-16
  • Resolved: 2007-10-09
Related Reports
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_02-b05, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Linux dagobert 2.6.16.27-0.9-default #1 Tue Feb 13 09:35:18 UTC 2007 x86_64 x86_64 x86_64 GNU/Linux


EXTRA RELEVANT SYSTEM CONFIGURATION :
X server: xorg-x11-6.9.0-50.17
Window manager: fvwm2-2.5.12-18

A DESCRIPTION OF THE PROBLEM :
Initiating a drag operation may completely lock up the X server, making all X applications completely unresponsive. Only killing the Java VM from the console unlocks X.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The bug so far is only reproducible in a somewhat complex application.We spent four hours trying to produce a simple example reproducing it, but didn't succeed.
However, from the thread dump in frozen state (see below) it is obvious that an XSync() call never returns, locking up the AWT thread and X because of a grabbed server.
Analyzing the code around the traceback reveals that the sequence
XGrabServer()
XCreateWindow()
XMapWindow()
XSync()
in sun.awt.X11.MotifDnDConstants.createMotifWindow() leads to the lockup. We assume that under some circumstances XMapWindow() does not succeed with a grabbed server.
Everything works fine if createMotifWindow() is not executed, e.g. if the DnD window already exists. This coincides with the observation that once a successful drag has been made in a simple Java app, the problem disappears until X is restarted.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Starting a drag should not lock X.
ACTUAL -
Starting a drag locks X.

ERROR MESSAGES/STACK TRACES THAT OCCUR :
2007-07-09 09:40:35
Full thread dump Java HotSpot(TM) 64-Bit Server VM (1.6.0_02-b05 mixed mode):

"TimerQueue" daemon prio=10 tid=0x00002aaaba687400 nid=0xdf5 in Object.wait() [0x0000000041b3c000..0x0000000041b3cd20]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaaaea0a7f0> (a javax.swing.TimerQueue)
	at javax.swing.TimerQueue.run(TimerQueue.java:236)
	- locked <0x00002aaaaea0a7f0> (a javax.swing.TimerQueue)
	at java.lang.Thread.run(Thread.java:619)

"DestroyJavaVM" prio=10 tid=0x00002aaaab00c400 nid=0xde4 waiting on condition [0x0000000000000000..0x0000000040a2bd90]
   java.lang.Thread.State: RUNNABLE

"Timer-0" daemon prio=10 tid=0x00002aaaba5fb000 nid=0xdf4 in Object.wait() [0x0000000041a3b000..0x0000000041a3bba0]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaab07a9b98> (a java.util.TaskQueue)
	at java.lang.Object.wait(Object.java:485)
	at java.util.TimerThread.mainLoop(Timer.java:483)
	- locked <0x00002aaab07a9b98> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:462)

"Thread-2" daemon prio=10 tid=0x00002aaabad84400 nid=0xdf3 waiting on condition [0x000000004193a000..0x000000004193ac20]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00002aaab0759bf0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
	at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:317)
	at ch.infox.gui.SlowTask$1.run(SlowTask.java:132)

"Thread-1" daemon prio=10 tid=0x00002aaab9dc0000 nid=0xdf2 waiting on condition [0x0000000041839000..0x0000000041839aa0]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00002aaab05568e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
	at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:317)
	at ch.infox.gui.SlowAction$1.run(SlowAction.java:74)

"AWT-EventQueue-0" prio=10 tid=0x00002aaab93d3000 nid=0xdf1 runnable [0x0000000041737000..0x0000000041738b20]
   java.lang.Thread.State: RUNNABLE
	at sun.awt.X11.XlibWrapper.XSync(Native Method)
	at sun.awt.X11.XToolkit.XSync(XToolkit.java:965)
	at sun.awt.X11.XToolkit.WITH_XERROR_HANDLER(XToolkit.java:111)
	at sun.awt.X11.MotifDnDConstants.createMotifWindow(MotifDnDConstants.java:174)
	at sun.awt.X11.MotifDnDConstants.getMotifWindow(MotifDnDConstants.java:210)
	at sun.awt.X11.MotifDnDConstants.getIndexForTargetList(MotifDnDConstants.java:429)
	at sun.awt.X11.MotifDnDDragSourceProtocol.initializeDragImpl(MotifDnDDragSourceProtocol.java:58)
	at sun.awt.X11.XDragSourceProtocol.initializeDrag(XDragSourceProtocol.java:79)
	at sun.awt.X11.XDragSourceContextPeer.startDrag(XDragSourceContextPeer.java:153)
	at sun.awt.dnd.SunDragSourceContextPeer.startDrag(SunDragSourceContextPeer.java:111)
	at java.awt.dnd.DragSource.startDrag(DragSource.java:306)
	at java.awt.dnd.DragSource.startDrag(DragSource.java:403)
	at java.awt.dnd.DragGestureEvent.startDrag(DragGestureEvent.java:223)
	at javax.swing.TransferHandler$DragHandler.dragGestureRecognized(TransferHandler.java:1530)
	at java.awt.dnd.DragGestureRecognizer.fireDragGestureRecognized(DragGestureRecognizer.java:339)
	- locked <0x00002aaaaec2ee70> (a javax.swing.TransferHandler$SwingDragGestureRecognizer)
	at javax.swing.TransferHandler$SwingDragGestureRecognizer.gestured(TransferHandler.java:1588)
	at javax.swing.TransferHandler.exportAsDrag(TransferHandler.java:663)
	at javax.swing.plaf.basic.DragRecognitionSupport.mouseDraggedImpl(DragRecognitionSupport.java:160)
	at javax.swing.plaf.basic.DragRecognitionSupport.mouseDragged(DragRecognitionSupport.java:76)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.mouseDragged(BasicTreeUI.java:3542)
	at java.awt.AWTEventMulticaster.mouseDragged(AWTEventMulticaster.java:302)
	at java.awt.Component.processMouseMotionEvent(Component.java:6086)
	at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3283)
	at java.awt.Component.processEvent(Component.java:5807)
	at java.awt.Container.processEvent(Container.java:2058)
	at java.awt.Component.dispatchEventImpl(Component.java:4410)
	at java.awt.Container.dispatchEventImpl(Container.java:2116)
	at java.awt.Component.dispatchEvent(Component.java:4240)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4003)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
	at java.awt.Container.dispatchEventImpl(Container.java:2102)
	at java.awt.Window.dispatchEventImpl(Window.java:2429)
	at java.awt.Component.dispatchEvent(Component.java:4240)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	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=10 tid=0x00002aaab93d2800 nid=0xdf0 in Object.wait() [0x0000000041637000..0x0000000041637da0]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaab04e9430> (a java.lang.Object)
	at java.lang.Object.wait(Object.java:485)
	at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)
	- locked <0x00002aaab04e9430> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:619)

"AWT-XAWT" daemon prio=10 tid=0x00002aaab94c5000 nid=0xdee waiting on condition [0x0000000041435000..0x0000000041435ca0]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00002aaab050cc00> (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:747)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)
	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:245)
	at sun.awt.X11.XToolkit.waitForEvents(Native Method)
	at sun.awt.X11.XToolkit.run(XToolkit.java:544)
	at sun.awt.X11.XToolkit.run(XToolkit.java:519)
	at java.lang.Thread.run(Thread.java:619)

"Java2D Disposer" daemon prio=10 tid=0x00002aaab930a800 nid=0xded in Object.wait() [0x0000000041334000..0x0000000041334d20]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaab04e95d0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
	- locked <0x00002aaab04e95d0> (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=0x00002aaab9320000 nid=0xdeb runnable [0x0000000000000000..0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x00002aaab931e000 nid=0xdea waiting on condition [0x0000000000000000..0x0000000041030a90]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x00002aaab931c800 nid=0xde9 waiting on condition [0x0000000000000000..0x0000000040f2fb20]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00002aaab931ac00 nid=0xde8 runnable [0x0000000000000000..0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00002aaab92f8c00 nid=0xde7 in Object.wait() [0x0000000040d2e000..0x0000000040d2ee20]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaab04e9960> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
	- locked <0x00002aaab04e9960> (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=0x00002aaab92f8400 nid=0xde6 in Object.wait() [0x0000000040c2d000..0x0000000040c2dca0]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00002aaab04e9480> (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 <0x00002aaab04e9480> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x00002aaaab0f1400 nid=0xde5 runnable

"VM Periodic Task Thread" prio=10 tid=0x00002aaab9322000 nid=0xdec waiting on condition

JNI global references: 857

Heap
 def new generation   total 10368K, used 4859K [0x00002aaaae890000, 0x00002aaaaf3c0000, 0x00002aaab0490000)
  eden space 9280K,  40% used [0x00002aaaae890000, 0x00002aaaaec3ece0, 0x00002aaaaf1a0000)
  from space 1088K, 100% used [0x00002aaaaf2b0000, 0x00002aaaaf3c0000, 0x00002aaaaf3c0000)
  to   space 1088K,   0% used [0x00002aaaaf1a0000, 0x00002aaaaf1a0000, 0x00002aaaaf2b0000)
 tenured generation   total 22796K, used 20052K [0x00002aaab0490000, 0x00002aaab1ad3000, 0x00002aaab3c90000)
   the space 22796K,  87% used [0x00002aaab0490000, 0x00002aaab1825358, 0x00002aaab1825400, 0x00002aaab1ad3000)
 compacting perm gen  total 21248K, used 19470K [0x00002aaab3c90000, 0x00002aaab5150000, 0x00002aaab9090000)
   the space 21248K,  91% used [0x00002aaab3c90000, 0x00002aaab4f93b80, 0x00002aaab4f93c00, 0x00002aaab5150000)
No shared spaces configured.



REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
Unfortunately not available so far.
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Removing the calls to XGrabServer() and XUngrabServer() in sun.awt.X11.MotifDnDConstants.createMotifWindow() resolves the problem. We therefore now apply a corresponding patch to jre/lib/rt.jar to all our JVM installations.

Comments
EVALUATION I run Netbeans, SwingSet2 on RHAS5 with fvwm-2.4.19. Java version: java version "1.6.0_02-ea" Java(TM) SE Runtime Environment (build 1.6.0_02-ea-b02) Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_02-ea-b02, mixed mode) there are no any problems with intra- and local- JVM drag and drop. But (even if DnD is not turned on) windows some time are disapeared without any messages on console (looks like the application is absolutly working, but WM does not show the window). If there would not any response from submitter I would close the request as not reproducible.
13-07-2007

EVALUATION I executed a couple of (big enough) applications - NetBeans and SwingSet2 on fvwm2. I used 32 bit linux (currently I do not have installed fvwm2 on 64 bit linux). There were no problems with drag and drop.
11-07-2007

EVALUATION At the moment I cannot reproduce the problem. Could the submitter point me to some well-known accessible java application to reproduce the issue?
10-07-2007