JDK-7149913 : [macosx] Deadlock in LWTextComponentPeer
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 7u4
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: os_x
  • CPU: generic
  • Submitted: 2012-02-29
  • Updated: 2012-04-04
  • Resolved: 2012-04-04
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 JDK 8
7u4 b18Fixed 8Fixed
Description
This test usually hangs with deadlock:
closed/java/awt/TextComponent/DeselectionDuringDoSelectionNonVisibleTest/DeselectionDuringDoSelectionNonVisibleTest.html

Java stack information for the threads listed above:
===================================================
"AWT-EventQueue-0":
	at sun.lwawt.LWComponentPeer$1.addDirtyRegion(LWComponentPeer.java:218)
	- waiting to lock <0x00000001240618e0> (a java.awt.Component$AWTTreeLock)
	at javax.swing.RepaintManager.addDirtyRegion(RepaintManager.java:447)
	at javax.swing.JComponent.repaint(JComponent.java:4795)
	at java.awt.Component.repaint(Component.java:3329)
	at javax.swing.text.DefaultCaret.repaint(DefaultCaret.java:245)
	- locked <0x00000001240facf8> (a com.apple.laf.AquaCaret)
	at com.apple.laf.AquaCaret.damage(AquaCaret.java:181)
	- locked <0x00000001240facf8> (a com.apple.laf.AquaCaret)
	at javax.swing.text.DefaultCaret.repaintNewCaret(DefaultCaret.java:1320)
	at javax.swing.text.DefaultCaret$1.run(DefaultCaret.java:1286)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
	at java.awt.EventQueue.access$000(EventQueue.java:102)
	at java.awt.EventQueue$3.run(EventQueue.java:662)
	at java.awt.EventQueue$3.run(EventQueue.java:660)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
"AppletThread":
	at javax.swing.text.DefaultCaret.repaint(DefaultCaret.java:244)
	- waiting to lock <0x00000001240facf8> (a com.apple.laf.AquaCaret)
	at javax.swing.text.DefaultCaret.changeCaretPosition(DefaultCaret.java:1260)
	at javax.swing.text.DefaultCaret.handleMoveDot(DefaultCaret.java:1097)
	at javax.swing.text.DefaultCaret.moveDot(DefaultCaret.java:1091)
	at javax.swing.text.DefaultCaret.moveDot(DefaultCaret.java:1059)
	at javax.swing.text.JTextComponent.moveCaretPosition(JTextComponent.java:1553)
	at javax.swing.text.JTextComponent.select(JTextComponent.java:1923)
	at sun.lwawt.LWTextComponentPeer.select(LWTextComponentPeer.java:151)
	- locked <0x00000001240618e0> (a java.awt.Component$AWTTreeLock)
	at java.awt.TextComponent.selectAll(TextComponent.java:481)
	- locked <0x0000000124053a18> (a java.awt.TextField)
	at DeselectionDuringDoSelectionNonVisibleTest.test(DeselectionDuringDoSelectionNonVisibleTest.java:50)
	at DeselectionDuringDoSelectionNonVisibleTest.start(DeselectionDuringDoSelectionNonVisibleTest.java:34)
	at com.sun.javatest.regtest.AppletWrapper$AppletRunnable.run(AppletWrapper.java:152)
	at java.lang.Thread.run(Thread.java:722)

Found 1 deadlock.

Comments
EVALUATION Deadlock description: Thread1: In start method of the applet we call TextComponent->selectAll()->then acquire delagetLock and call synchronized DefaultCaret.repaint() method. Thread2: Text caret flusher calls DefaultCaret.repaint() method on the EDT and then in the addDirtyRegion() we try to acquire delagetLock.
26-03-2012

EVALUATION Removed code(see suggested fix) initially was added to stop recursion between paintPeer and addDirtyRegion( repaintPeer()->paintPeer()->print()->addDirtyRegion()->repaintPeer()-> etc), but it is impossible now because repaintPeer() asynchronous.
26-03-2012

SUGGESTED FIX http://cr.openjdk.java.net/~serb/7149913/webrev.00/
11-03-2012

EVALUATION Deadlock happens when 2 threads lock delegateLock and DefaultCaret object in different order.
11-03-2012