rob hinds created PDFBOX-3521:
---------------------------------
Summary: FontProvider not thread safe
Key: PDFBOX-3521
URL: https://issues.apache.org/jira/browse/PDFBOX-3521
Project: PDFBox
Issue Type: Bug
Reporter: rob hinds
Priority: Minor
I understand that PDFBox is not yet thread-safe, however, from reading this
comment on a [similar
ticket|https://issues.apache.org/jira/browse/PDFBOX-3071?focusedCommentId=14982069&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14982069],
it seems like the fonts should be thread safe and is something that we want to
fix. However, I am experiencing an intermittent NullPointerException when
running multi-threaded unit tests that attempt to read several PDFs at once
(see details
[here|http://stackoverflow.com/questions/39831376/pdfbox-npe-loading-fonts].
Inside FontMapperImpl.java the getProvider and setProvider methods are
synchronised:
{code}
public synchronized void setProvider(FontProvider fontProvider)
{
this.fontProvider = fontProvider;
fontInfoByName = createFontInfoByName(fontProvider.getFontInfo());
}
/**
* Returns the font service provider. Defaults to using
FileSystemFontProvider.
*/
public synchronized FontProvider getProvider()
{
if (fontProvider == null)
{
setProvider(DefaultFontProvider.INSTANCE);
}
return fontProvider;
}
{code}
However, the calling code from the findFont() method is not synchronised:
{code}
// make sure the font provider is initialized
if (fontProvider == null)
{
getProvider();
}
// first try to match the PostScript name
FontInfo info = getFont(format, postScriptName);
if (info != null)
{
return info.getFont();
}
{code}
As a result, if multiple threads attempt to access this at once, thread A may
be in the setProvider method and have set fontProvider, but still processing
the creation of fontInfoByName - so thread B could attempt to access before
initialised.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]