| Other |
|---|
| tbdResolved |
|
Duplicate :
|
|
|
Relates :
|
Accidentally caught the suspicious exception that the reference to the CMM profile is null. Looks like the problem is in the deferral machinery it does not thread-safe:
The test which always triggers this bug:
import java.awt.color.ColorSpace;
import java.awt.color.ICC_Profile;
import java.awt.color.ICC_ProfileRGB;
import java.util.concurrent.CountDownLatch;
public final class MTInitCMM {
public static void main(String[] args) throws Exception {
var rgb = (ICC_ProfileRGB) ICC_Profile.getInstance(ColorSpace.CS_sRGB);
Thread[] threads = new Thread[100];
CountDownLatch go = new CountDownLatch(1);
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(() -> {
try {
go.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
rgb.getMatrix();
});
}
for (Thread thread : threads) {
thread.start();
}
go.countDown();
for (Thread thread : threads) {
thread.join();
}
}
}
==========
The output:
java.lang.NullPointerException: Cannot load from byte/boolean array because "array" is null
at java.desktop/java.awt.color.ICC_Profile.intFromBigEndian(ICC_Profile.java:1741)
at java.desktop/java.awt.color.ICC_Profile.getXYZTag(ICC_Profile.java:1542)
at java.desktop/java.awt.color.ICC_ProfileRGB.getMatrix(ICC_ProfileRGB.java:149)
at MTInitCMM.lambda$main$0(MTInitCMM.java:19)
at java.base/java.lang.Thread.run(Thread.java:832)