United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 7149913 [macosx] Deadlock in LWTextComponentPeer
7149913 : [macosx] Deadlock in LWTextComponentPeer

Details
Type:
Bug
Submit Date:
2012-02-29
Status:
Closed
Updated Date:
2012-04-04
Project Name:
JDK
Resolved Date:
2012-04-04
Component:
client-libs
OS:
os_x
Sub-Component:
java.awt
CPU:
generic
Priority:
P2
Resolution:
Fixed
Affected Versions:
7u4
Fixed Versions:
7u4

Related Reports
Backport:

Sub Tasks

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

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.
                                     
2012-03-26
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.
                                     
2012-03-26
SUGGESTED FIX

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

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



Hardware and Software, Engineered to Work Together