Hi, FYI, I’ve just committed a fix for this bug: http://svn.apache.org/viewvc?rev=904467&view=rev
If you ever need to you can apply the patch to FOP 0.95’s source code as is. As a side note, introducing a new object just for synchronization purpose is not necessary. The class object (PDFICCBasedColorSpace.class) can be used for that. Regards, Vincent Anil Pinto wrote: > Andreas, > > I have not encountered the problem since, thankfully, so you are right the > chances of it happening seem to be quite slim ;-) > > Though I am glad you replied, I was getting a feeling the question was > ignored for some reason unknown to me. > > Appreciate the time taken to describe in detail the cause and possible fix. > I guess I can wait until the patch gets applied and is available in the next > stable release. > > Thank you very much for your response. Have a great weekend ahead. > Anil Pinto. > > Lobo Technologies, Inc. > 16980 Via Tazon, Suite 120, San Diego, CA 92127 > Voice : 858-485-9033 x 103 > Fax : 858-485-9152 > > > -----Original Message----- > From: Andreas Delmelle [mailto:andreas.delme...@telenet.be] > Sent: Thursday, January 14, 2010 10:36 AM > To: Anil Pinto > Cc: fop-dev@xmlgraphics.apache.org > Subject: Re: ConcurrentModificationException error > > > On 10 Dec 2009, at 03:24, Anil Pinto wrote: > > Hi Anil > > (Didn't see a response for this one come in, so far on fop-us...@... > Apologies if the reply comes a bit late.) > >> We have FOP (0.95) embedded in a multithreaded environment to create many > PDFs almost simultaneously. >> We hav been using this configuration for 6 months plus now. I noticed the > following trace for the first time and it caught my attention, as I thought > we have followed all the multithreaded requirements required by FOP. > > It is pointing to a bug in FOP, due to a slight oversight in making use of > java.awt.ICC_Profile, IIC. > >> java.util.ConcurrentModificationException >> at > java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) >> at java.util.AbstractList$Itr.next(AbstractList.java:343) >> at > sun.awt.color.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:75 > ) >> at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:756) >> at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:996) > > Checking the Javadocs, there is no mention anywhere of the multi-thread > (un)safety of ICC_Profile or the call to getInstance(). So, I think we can > only safely assume that this means it is unsafe. > >> at > org.apache.fop.pdf.PDFICCBasedColorSpace.setupsRGBColorProfile(PDFICCBasedCo > lorSpace.java:140) > > Seen that it is a static method calling another static method, the chances > of anything bad happening are very slim, but so you stumbled upon it. :( > Seems a perfect example of a race condition, though: you mean this is the > first time in all those 6 months that this error occurred? Very slim indeed, > then! > > As for the good news (I hope I am correct about this): > FOP can solve this easily, either by making setupsRGBProfile() a > synchronized method, or by performing only the call to > ICC_Profile.getInstance() in a synchronized block. My preference goes in the > direction of the latter, as that limits the synchronization overhead to the > single call into the AWT library, which is causing the issue. The rest of > the method appears safe for concurrent runs, at first glance. > The (minor) downside is that we would have to introduce a new static final > to synchronize the calls on. > > Very quick patch below (vs current trunk; don't know if it can be applied to > 0.95 without small changes...). > > > HTH! > > Regards, > > Andreas > > --- > Index: src/java/org/apache/fop/pdf/PDFICCBasedColorSpace.java > =================================================================== > --- src/java/org/apache/fop/pdf/PDFICCBasedColorSpace.java (revision > 679326) > +++ src/java/org/apache/fop/pdf/PDFICCBasedColorSpace.java Wed Jan 13 > 20:29:07 CET 2010 > @@ -34,6 +34,8 @@ > private PDFICCStream iccStream; > private String explicitName; > > + private static final Object _S = new Object(); > + > /** > * Constructs a the ICCBased color space with an explicit name (ex. > "DefaultRGB"). > * @param explicitName an explicit name or null if a name should be > generated > @@ -137,7 +139,9 @@ > InputStream in = PDFDocument.class.getResourceAsStream("sRGB Color > Space Profile.icm"); > if (in != null) { > try { > + synchronized (_S) { > - profile = ICC_Profile.getInstance(in); > + profile = ICC_Profile.getInstance(in); > + } > } catch (IOException ioe) { > throw new RuntimeException( > "Unexpected IOException loading the sRGB profile: " > + ioe.getMessage()); > --- >