JDK-6417055 : JCK15a: DefaultHSBFileChooserPanel hangs on creating HSB image
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.5a,5.0
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86
  • Submitted: 2006-04-24
  • Updated: 2012-03-23
  • Resolved: 2008-07-18
Related Reports
Duplicate :  
Description
Filed By       : JCK team (###@###.###)
JCK            : JCK1.5a
J2SE           : 1.5 (build 1.5.0_04-b05, mixed mode, sharing)
Platform[s]    : Linux
JCK test owners: http://javaweb.sfbay/jcce/tcks/jck/docs/others/owners.jto
switch/Mode    : FAILED with -Xshare:on  on x86 machine with Hyper-Threading support
                 PASSED with -Xshare:on  on x86 machine WITHOUT Hyper-Threading support

Failing Tests  :
==================
api/javax_swing/JColorChooser/index.html#getsetTests


JCK test source location:
==========================
/java/re/jck/1.5a/latest/binaries/JCK-runtime-15a/tests


Problem description:
=====================
The following JCK1.5a tests:
  api/javax_swing/JColorChooser/index.html#getsetTests
hangs when running in a loop.

The problem can be reproduced with running it in a loop. Below is the exact command line:

while `true` ; \
  do $JDK_HOME/bin/java -Xverify:all -Xshare:on \
  -cp $JCK_HOME/JCK-runtime-15a/classes -Djava.security.policy=$JCK_HOME/JCK-runtime-15a/lib/jck.policy \
  javasoft.sqe.tests.api.javax.swing.JColorChooser.getsetTests -TestCaseID ALL; \
done


It is known that the loop eventually hangs on Linux machine with Hyper-Threading processors
when java is run with -Xshare:on option. The loop does not hang on Linux machines without
Hyper-Threading processors.

Additional info:
=================
uname -a:
Linux 2.6.13-15-smp #1 SMP Tue Sep 13 14:56:15 UTC 2005 i686 i686 i386 GNU/Linux)


Test output:
=============
Full thread dump Java HotSpot(TM) Client VM (1.5.0_04-b05 mixed mode, sharing):

"SyntheticImageGenerator" daemon prio=1 tid=0x45c143c8 nid=0x369 in Object.wait() [0x46555000..0x465551c0]
       at java.lang.Object.wait(Native Method)
       at java.lang.Object.wait(Object.java:474)
       at javax.swing.colorchooser.DefaultHSBChooserPanel$HSBImage.computeRow(DefaultHSBChooserPanel.java:703)
       - locked <0x659b1060> (a javax.swing.colorchooser.DefaultHSBChooserPanel$HSBImage)
       at javax.swing.colorchooser.SyntheticImageGenerator.run(SyntheticImage.java:124)

"AWT-XAWT" daemon prio=1 tid=0x0835b328 nid=0x349 runnable [0x463d2000..0x463d21c0]
       at sun.awt.X11.XToolkit.waitForEvents(Native Method)
       at sun.awt.X11.XToolkit.run(XToolkit.java:463)
       at sun.awt.X11.XToolkit.run(XToolkit.java:438)
       at java.lang.Thread.run(Thread.java:595)

"Java2D Disposer" daemon prio=1 tid=0x082da490 nid=0x348 in Object.wait() [0x4633f000..0x4633fe40]
       at java.lang.Object.wait(Native Method)
       - waiting on <0x65e4bc00> (a java.lang.ref.ReferenceQueue$Lock)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
       - locked <0x65e4bc00> (a java.lang.ref.ReferenceQueue$Lock)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
       at sun.java2d.Disposer.run(Disposer.java:107)
       at java.lang.Thread.run(Thread.java:595)

"Low Memory Detector" daemon prio=1 tid=0x45c00ab0 nid=0x346 runnable [0x00000000..0x00000000]

"CompilerThread0" daemon prio=1 tid=0x080a13d0 nid=0x345 waiting on condition [0x00000000..0x45d7f9a8]

"Signal Dispatcher" daemon prio=1 tid=0x080a0408 nid=0x344 runnable [0x00000000..0x00000000]

"Finalizer" daemon prio=1 tid=0x0809a0c0 nid=0x343 in Object.wait() [0x45b2b000..0x45b2c0c0]
       at java.lang.Object.wait(Native Method)
       - waiting on <0x65e245d8> (a java.lang.ref.ReferenceQueue$Lock)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
       - locked <0x65e245d8> (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=1 tid=0x08098240 nid=0x342 in Object.wait() [0x45aab000..0x45aab140]
       at java.lang.Object.wait(Native Method)
       - waiting on <0x65e24378> (a java.lang.ref.Reference$Lock)
       at java.lang.Object.wait(Object.java:474)
       at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
       - locked <0x65e24378> (a java.lang.ref.Reference$Lock)

"main" prio=1 tid=0x0805bba8 nid=0x340 in Object.wait() [0xbfc91000..0xbfc91f18]
       at java.lang.Object.wait(Native Method)
       - waiting on <0x65e60660> (a java.awt.MediaTracker)
       at java.awt.MediaTracker.waitForID(MediaTracker.java:651)
       - locked <0x65e60660> (a java.awt.MediaTracker)
       at javax.swing.ImageIcon.loadImage(ImageIcon.java:234)
       - locked <0x65e60660> (a java.awt.MediaTracker)
       at javax.swing.ImageIcon.<init>(ImageIcon.java:165)
       at javax.swing.colorchooser.DefaultHSBChooserPanel.initializePalettesIfNecessary(DefaultHSBChooserPanel.java:463)
       at javax.swing.colorchooser.DefaultHSBChooserPanel.buildSliderPalettePanel(DefaultHSBChooserPanel.java:433)
       at javax.swing.colorchooser.DefaultHSBChooserPanel.buildChooser(DefaultHSBChooserPanel.java:257)
       at javax.swing.colorchooser.AbstractColorChooserPanel.installChooserPanel(AbstractColorChooserPanel.java:141)
       at javax.swing.colorchooser.DefaultHSBChooserPanel.installChooserPanel(DefaultHSBChooserPanel.java:226)
       at javax.swing.plaf.basic.BasicColorChooserUI$Handler.propertyChange(BasicColorChooserUI.java:279)
       at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333)
       at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:270)
       at java.awt.Component.firePropertyChange(Component.java:7159)
       at javax.swing.JColorChooser.setChooserPanels(JColorChooser.java:454)
       at javax.swing.JColorChooser.addChooserPanel(JColorChooser.java:394)
       at javasoft.sqe.tests.api.javax.swing.JColorChooser.getsetTests.JColorChooser0011(getsetTests.java:289)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:399)
       at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
       at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:127)
       at javasoft.sqe.tests.api.javax.swing.JColorChooser.getsetTests.main(getsetTests.java:34)

"VM Thread" prio=1 tid=0x08095748 nid=0x341 runnable

"VM Periodic Task Thread" prio=1 tid=0x45c02008 nid=0x347 waiting on condition
=============

Comments
EVALUATION The problem is in the SyntheticImage class that is used to draw the color diagram. This class was rewritten in the fix for the 6552812 bug.
18-07-2008

EVALUATION According to thread dump from the bug description, the SynteticImageGenerator thread waits on isDirty flag when first row of HSBImage is calculated (DefaultHSBChooserPanel.java, lines 720 - 722). However, if method addConsumer() (DefaultHSBChooserPanel.java, lines 646 - 649) is called after the start of image production (i.e, atert the start of the SynteticImageGenerator thread), the wait() on line 721 never get notification about isDirty changes. In this case, the image is not produced and MediaTracker never gets first image frame. It looks like this scenario happened when JCK test was ran on smp linux system with -Xshare:on flag. To solve this problem, we can call notifyAll() after isDirty flag changes like it is done in the nextFrame() method of the HSBImage class.
05-05-2006

EVALUATION Talked to ###@###.###. Since all we really have here is a hanging MediaTracker, makes sense to have 2D look at this first.
24-04-2006