[ 
https://issues.apache.org/jira/browse/PDFBOX-3521?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15558517#comment-15558517
 ] 

ASF subversion and git services commented on PDFBOX-3521:
---------------------------------------------------------

Commit 1763931 from [~tilman] in branch 'pdfbox/trunk'
[ https://svn.apache.org/r1763931 ]

PDFBOX-3521: set fontProvider last to avoid concurrency problems, as suggested 
by Rob Hinds

> FontProvider not thread safe
> ----------------------------
>
>                 Key: PDFBOX-3521
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3521
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 2.0.3, 2.1.0
>            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]

Reply via email to