[ 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)