[
https://issues.apache.org/jira/browse/FOP-1608?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
simon steiner updated FOP-1608:
-------------------------------
Summary: [PATCH] Synchronization fault in FontInfoFinder (was:
Synchronization fault in FontInfoFinder)
> [PATCH] Synchronization fault in FontInfoFinder
> -----------------------------------------------
>
> Key: FOP-1608
> URL: https://issues.apache.org/jira/browse/FOP-1608
> Project: FOP
> Issue Type: Bug
> Components: font/unqualified
> Affects Versions: trunk
> Environment: Operating System: All
> Platform: All
> Reporter: ilj
> Attachments: b46336.diff, b46336.diff, b46336.diff
>
>
> I have a multi-threaded rendering application. It produced this exception:
> java.lang.NullPointerException
> at
> org.apache.fop.fonts.autodetect.FontInfoFinder.find(FontInfoFinder.java:172)
> at
> org.apache.fop.render.PrintRendererConfigurator.addFontInfoListFromFileList(PrintRendererConfigurator.java:233)
> at
> org.apache.fop.render.PrintRendererConfigurator.buildFontListFromConfiguration(PrintRendererConfigurator.java:140)
> at
> org.apache.fop.render.PrintRendererConfigurator.configure(PrintRendererConfigurator.java:95)
> at
> org.apache.fop.render.pdf.PDFRendererConfigurator.configure(PDFRendererConfigurator.java:71)
> at
> org.apache.fop.render.RendererFactory.createRenderer(RendererFactory.java:187)
> at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:68)
> at org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:127)
> at org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:102)
> at
> org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:224)
> at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:100)
> at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:100)
> at org.apache.fop.apps.Fop.<init>(Fop.java:78)
> at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:247)
> ...
> I guess the problem is, that you don't synchronize usage of FontCache in this
> method:
> 150 public EmbedFontInfo find(URL fontUrl, FontResolver resolver,
> FontCache fontCache) {
> 151 String embedUrl = null;
> 152 embedUrl = fontUrl.toExternalForm();
> 153
> 154 long fileLastModified = -1;
> 155 if (fontCache != null) {
> 156 try {
> 157 URLConnection conn = fontUrl.openConnection();
> 158 try {
> 159 fileLastModified = conn.getLastModified();
> 160 } finally {
> 161 //An InputStream is created even if it's not
> accessed, but we need to close it.
> 162 IOUtils.closeQuietly(conn.getInputStream());
> 163 }
> 164 } catch (IOException e) {
> 165 // Should never happen, because URL must be local
> 166 log.debug("IOError: " + e.getMessage());
> 167 fileLastModified = 0;
> 168 }
> 169 // firstly try and fetch it from cache before loading/parsing
> the font file
> 170 if (fontCache.containsFont(embedUrl)) {
> 171 CachedFontInfo fontInfo = fontCache.getFont(embedUrl);
> 172 if (fontInfo.lastModified() == fileLastModified) {
> 173 return fontInfo;
> 174 } else {
> 175 // out of date cache item
> 176 fontCache.removeFont(embedUrl);
> 177 }
> 178 // is this a previously failed parsed font?
> 179 } else if (fontCache.isFailedFont(embedUrl,
> fileLastModified)) {
> 180 if (log.isDebugEnabled()) {
> 181 log.debug("Skipping font file that failed to load
> previously: " + embedUrl);
> 182 }
> 183 return null;
> 184 }
> 185 }
> 186
> 187 // try to determine triplet information from font file
> 188 CustomFont customFont = null;
> 189 try {
> 190 customFont = FontLoader.loadFont(fontUrl, resolver);
> 191 } catch (Exception e) {
> 192 //TODO Too verbose (it's an error but we don't care if some
> fonts can't be loaded)
> 193 if (log.isErrorEnabled()) {
> 194 log.error("Unable to load font file: " + embedUrl + ".
> Reason: " + e.getMessage());
> 195 }
> 196 if (fontCache != null) {
> 197 fontCache.registerFailedFont(embedUrl, fileLastModified);
> 198 }
> 199 return null;
> 200 }
> 201 return fontInfoFromCustomFont(fontUrl, customFont, fontCache);
>
> 202 }
> 203 }
> 204
> When thread1 and thread2 both enter IF at line 170, one can remove the font
> and then the other will get null at line 171.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)