You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/12/25 11:22:18 UTC
svn commit: r1884796 - in
/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color:
PDDeviceCMYK.java PDDeviceRGB.java
Author: tilman
Date: Fri Dec 25 11:22:17 2020
New Revision: 1884796
URL: http://svn.apache.org/viewvc?rev=1884796&view=rev
Log:
PDFBOX-5056: fix double-checked locking, as suggested by Mike Kaplinskiy; closes #90
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java?rev=1884796&r1=1884795&r2=1884796&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java Fri Dec 25 11:22:17 2020
@@ -47,7 +47,8 @@ public class PDDeviceCMYK extends PDDevi
}
private final PDColor initialColor = new PDColor(new float[] { 0, 0, 0, 1 }, this);
- private volatile ICC_ColorSpace awtColorSpace;
+ private ICC_ColorSpace awtColorSpace;
+ private volatile boolean initDone = false;
private boolean usePureJavaCMYKConversion = false;
protected PDDeviceCMYK()
@@ -60,14 +61,14 @@ public class PDDeviceCMYK extends PDDevi
protected void init() throws IOException
{
// no need to synchronize this check as it is atomic
- if (awtColorSpace != null)
+ if (initDone)
{
return;
}
synchronized (this)
{
// we might have been waiting for another thread, so check again
- if (awtColorSpace != null)
+ if (initDone)
{
return;
}
@@ -85,6 +86,9 @@ public class PDDeviceCMYK extends PDDevi
awtColorSpace.toRGB(new float[] { 0, 0, 0, 0 });
usePureJavaCMYKConversion = System
.getProperty("org.apache.pdfbox.rendering.UsePureJavaCMYKConversion") != null;
+
+ // Assignment to volatile must be the LAST statement in this block!
+ initDone = true;
}
}
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java?rev=1884796&r1=1884795&r2=1884796&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java Fri Dec 25 11:22:17 2020
@@ -36,7 +36,8 @@ public final class PDDeviceRGB extends P
public static final PDDeviceRGB INSTANCE = new PDDeviceRGB();
private final PDColor initialColor = new PDColor(new float[] { 0, 0, 0 }, this);
- private volatile ColorSpace awtColorSpace;
+ private ColorSpace awtColorSpace;
+ private volatile boolean initDone = false;
private PDDeviceRGB()
{
@@ -48,7 +49,7 @@ public final class PDDeviceRGB extends P
private void init()
{
// no need to synchronize this check as it is atomic
- if (awtColorSpace != null)
+ if (initDone)
{
return;
}
@@ -56,7 +57,7 @@ public final class PDDeviceRGB extends P
synchronized (this)
{
// we might have been waiting for another thread, so check again
- if (awtColorSpace != null)
+ if (initDone)
{
return;
}
@@ -66,6 +67,9 @@ public final class PDDeviceRGB extends P
// condition caused by lazy initialization of the color transform, so we perform
// an initial color conversion while we're still synchronized, see PDFBOX-2184
awtColorSpace.toRGB(new float[] { 0, 0, 0, 0 });
+
+ // This volatile write must be the LAST statement in the synchronized block!
+ initDone = true;
}
}