One more note:
I guess it is possible to create a stable test like below which can
reproduce the bug:
import java.awt.image.ColorModel;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.util.Hashtable;
public final class Test {
private volatile static Throwable fail;
public static void main(final String[] args) throws
InterruptedException {
final ImageConsumer ic = new ImageConsumer() {
@Override
public void setDimensions(int i, int i1) {
}
@Override
public void setProperties(Hashtable<?, ?> hashtable) {
}
@Override
public void setColorModel(ColorModel colorModel) {
}
@Override
public void setHints(int i) {
}
@Override
public void setPixels(int i, int i1, int i2, int i3,
ColorModel colorModel, byte[] bytes,
int i4,
int i5) {
}
@Override
public void setPixels(int i, int i1, int i2, int i3,
ColorModel colorModel, int[] ints,
int i4,
int i5) {
}
@Override
public void imageComplete(int i) {
}
};
final ImageProducer ip = new ImageProducer() {
@Override
public void addConsumer(ImageConsumer imageConsumer) {
}
@Override
public boolean isConsumer(ImageConsumer imageConsumer) {
return false;
}
@Override
public void removeConsumer(ImageConsumer imageConsumer) {
}
@Override
public void startProduction(ImageConsumer imageConsumer) {
}
@Override
public void requestTopDownLeftRightResend(
ImageConsumer imageConsumer) {
}
};
ImageFilter filter = new ImageFilter();
FilteredImageSource fis = new FilteredImageSource(ip, filter);
Thread t1 = new Thread(() -> {
try {
while (true) {
fis.addConsumer(ic);
}
} catch (Throwable t) {
fail = t;
}
});
Thread t2 = new Thread(() -> {
try {
while (true) {
fis.removeConsumer(ic);
}
} catch (Throwable t) {
fail = t;
}
});
Thread t3 = new Thread(() -> {
try {
while (true) {
fis.startProduction(ic);
}
} catch (Throwable t) {
fail = t;
}
});
t1.setDaemon(true);
t2.setDaemon(true);
t3.setDaemon(true);
t1.start();
t2.start();
t3.start();
t1.join(10000);
if (fail != null) {
throw new RuntimeException("Test fail", fail);
}
}
}
On 25/10/2017 23:58, Prahalad Kumar Narayanan wrote:
Hello Sergey
Thank you for the suggestion.
I 've updated JBS with below information.
1 . Stack trace information as provided by submitter-
java.lang.NullPointerException
at
java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:181)
at
java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:183)
at
sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:732)
at sun.awt.image.ToolkitImage.addWatcher(ToolkitImage.java:221)
2. Screenshot showing the occurrence of the exception at
FilteredImageSource.java: 181.
. The image also shows the test passing with JDK10 containing the
fix on VM running Linux Ubuntu x64.
Thank you
Have a good day
Prahalad N.
-----Original Message-----
From: Sergey Bylokhov
Sent: Thursday, October 26, 2017 12:05 PM
To: Prahalad Kumar Narayanan; 2d-dev
Subject: Re: [OpenJDK 2D-Dev] [10] RFR: JDK-8188083- NPE in
java.awt.image.FilteredImageSource.startProduction
Hi, Prahalad.
Can you please add a stack trace which include a line numbers to the bug
report? Currently it is unclear in what line an exception is occurred.
On 25/10/2017 21:07, Prahalad Kumar Narayanan wrote:
Hello Everyone
Good day to you.
Kindly review a fix for the bug
Bug ID: JDK-8188083
Description: Null Pointer Exception in
java.awt.image.FilteredImageSource.startProduction
Root Cause
. FilteredImageSource implements ImageProducer interface
. All the methods of FilteredImageSource operate on a common data
-HashTable, but only a few are synchronized methods.
. Thus, when synchronized & un-synchronized methods access / modify the
hash table in a multi-threaded scenario, it renders the class vulnerable to this
exception.
Exception occurrence
. The submitter has mentioned that there is no test-case to reproduce to
this issue.
. Luckily I was able to observe this issue with a "crude" test code
. The test triggered 7k threads in an ExecutorService randomly
adding/ removing/ invoking startProduction on FilteredImageSource object.
. I didn't feel it robust enough to be added as a part of
regression tests. I tried optimizing the test but in vain.
. Hence the test code isn't added to the webrev.
Details on the Fix:
. The concerned methods have been "synchronized" in the fix.
. No new regression failures were observed with this change.
Kindly review the change and provide your feedback.
In addition, kindly suggest whether this requires CSR as it adds "synchronized"
to method signature.
Review Link: http://cr.openjdk.java.net/~pnarayanan/8188083/webrev.00/
Thank you for your time in review
Have a good day
Prahalad N.
--
Best regards, Sergey.
--
Best regards, Sergey.