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

Andreas Lehmkühler commented on PDFBOX-5460:
--------------------------------------------

{quote}Why did we introduce it in the first place?{quote}
The initial version was introduced in PDFBOX-1689. It looks like it took 
several minutes to load external fonts containing lots of glyphs. According to 
[~tilman]  comment it took several minutes to load all fonts.

The observation was correct and still is. Parsinf all glyphs of such fonts is 
still an issue. But good news is, there is some special on demand load 
mechanism for glyphs in place which shouldn't be removed at all. My idea 
removes the on demand feature for the TTFTables only which doesn't include 
reading the single glyphs. I ran some simple tests. The on demand loading is 
approx. 2 times faster. This sounds a lot but this is done only once for 
building the cache and on my system we are talking about 1.5sec vs. 3sec it 
doesn't took minutes as in the past. IMHO that is something we can live with.

I had a quick look at the memory consumption and couldn't find any significant 
difference.

{quote}The other option would be to do an initial parse and close/reopen on 
demand{quote}
Sounds like a reasonable option, especially if we are thinking about closing 
the font instead of keeping it open forever to remove the finalize stuff. It 
should be easy to add some switch to limit the init process to the mandatory 
tables which are needed for the font cache calculations.

I'm in favour of simplifying things as long as there aren't any obvious reasons 
not to do so. If there are any issues in the long we might find a solution, 
maybe a better one as the old one we'd removed ;-)



> Deadlock in TrueTypeFont and RAFDataStream
> ------------------------------------------
>
>                 Key: PDFBOX-5460
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5460
>             Project: PDFBox
>          Issue Type: Bug
>          Components: FontBox
>    Affects Versions: 2.0.26
>            Reporter: Ram Lakshmanan
>            Priority: Major
>              Labels: deadlock
>             Fix For: 2.0.27, 3.0.0 PDFBox
>
>
> Deadlock is happening between *org.apache.fontbox.ttf.RAFDataStream* and 
> *org.apache.fontbox.ttf.TrueTypeFont* objects. Below is the stack trace of 
> the two threads which are in deadlock. If you want to see the complete thread 
> dump you can [refer it 
> here|https://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMjIvMDYvMTUvLS1wZGYtYm94LWRlYWRsb2NrLnppcC0tMjItMjQtNTc=&s=t].
>  
> {code:java}
> APP_Thread_50408_759_100162222_WorkerTask_1652842343227_P_Th_SPR-APP-pool-5-thread-6
> PRIORITY : 5
> THREAD ID : 0X00007F894C406000
> NATIVE ID : 0X44D1
> NATIVE ID (DECIMAL) : 17617
> STATE : BLOCKED
> stackTrace:
> java.lang.Thread.State: BLOCKED (on object monitor)
> at org.apache.fontbox.ttf.TrueTypeFont.getTable(TrueTypeFont.java:147)
> - waiting to lock <0x00000002d216fec8> (a org.apache.fontbox.ttf.TrueTypeFont)
> at 
> org.apache.fontbox.ttf.TrueTypeFont.getHorizontalMetrics(TrueTypeFont.java:229)
> at org.apache.fontbox.ttf.GlyphTable.getGlyphData(GlyphTable.java:210)
> at org.apache.fontbox.ttf.GlyphTable.getGlyph(GlyphTable.java:191)
> - locked <0x00000002d218ca28> (a org.apache.fontbox.ttf.RAFDataStream)
> at org.apache.fontbox.ttf.TrueTypeFont.getPath(TrueTypeFont.java:676)
> at org.apache.pdfbox.pdmodel.font.PDType1Font.getPath(PDType1Font.java:638)
> at 
> org.apache.pdfbox.rendering.Type1Glyph2D.getPathForCharacterCode(Type1Glyph2D.java:83)
> at org.apache.pdfbox.rendering.PageDrawer.drawGlyph2D(PageDrawer.java:495)
> at org.apache.pdfbox.rendering.PageDrawer.showFontGlyph(PageDrawer.java:476)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showGlyph(PDFStreamEngine.java:787)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showGlyph(PDFStreamEngine.java:805)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showText(PDFStreamEngine.java:743)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showTextString(PDFStreamEngine.java:606)
> at 
> org.apache.pdfbox.contentstream.operator.text.ShowText.process(ShowText.java:56)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:933)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:514)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:492)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:155)
> at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:277)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:347)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:268)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:228)
> at 
> xxxxxxx.export.service.thumbnail.PDFSlideGeneratorServiceImpl$1.call(PDFSlideGeneratorServiceImpl.java:60)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutorTask.doCall(ParallelExecutorTask.java:43)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor.executeTaskFromQueue(ParallelExecutor.java:154)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor.access$100(ParallelExecutor.java:26)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor$WorkerTask.doCall(ParallelExecutor.java:164)
> at 
> xxxxxxx.ops.executor.util.UserContextAwareCallable.call(UserContextAwareCallable.java:89)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> APP_Thread_50408_759_100162222_WorkerTask_1652842343227_P_Th_SPR-APP-pool-5-thread-5
> PRIORITY : 5
> THREAD ID : 0X00007F894C404800
> NATIVE ID : 0X44D0
> NATIVE ID (DECIMAL) : 17616
> STATE : BLOCKED
> stackTrace:
> java.lang.Thread.State: BLOCKED (on object monitor)
> at org.apache.fontbox.ttf.TrueTypeFont.readTable(TrueTypeFont.java:356)
> - waiting to lock <0x00000002d218ca28> (a 
> org.apache.fontbox.ttf.RAFDataStream)
> at org.apache.fontbox.ttf.TrueTypeFont.getTable(TrueTypeFont.java:150)
> - locked <0x00000002d216fec8> (a org.apache.fontbox.ttf.TrueTypeFont)
> at org.apache.fontbox.ttf.TrueTypeFont.getCmap(TrueTypeFont.java:262)
> at 
> org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapImpl(TrueTypeFont.java:556)
> at 
> org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:541)
> at org.apache.fontbox.ttf.TrueTypeFont.nameToGID(TrueTypeFont.java:629)
> at org.apache.fontbox.ttf.TrueTypeFont.hasGlyph(TrueTypeFont.java:698)
> at 
> org.apache.pdfbox.pdmodel.font.PDType1Font.getNameInFont(PDType1Font.java:601)
> at org.apache.pdfbox.pdmodel.font.PDType1Font.hasGlyph(PDType1Font.java:645)
> at 
> org.apache.pdfbox.rendering.Type1Glyph2D.getPathForCharacterCode(Type1Glyph2D.java:59)
> at org.apache.pdfbox.rendering.PageDrawer.drawGlyph2D(PageDrawer.java:495)
> at org.apache.pdfbox.rendering.PageDrawer.showFontGlyph(PageDrawer.java:476)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showGlyph(PDFStreamEngine.java:787)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showGlyph(PDFStreamEngine.java:805)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showText(PDFStreamEngine.java:743)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.showTextString(PDFStreamEngine.java:606)
> at 
> org.apache.pdfbox.contentstream.operator.text.ShowText.process(ShowText.java:56)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:933)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:514)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:492)
> at 
> org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:155)
> at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:277)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:347)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:268)
> at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:228)
> at 
> xxxxxxx.export.service.thumbnail.PDFSlideGeneratorServiceImpl$1.call(PDFSlideGeneratorServiceImpl.java:60)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutorTask.doCall(ParallelExecutorTask.java:43)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor.executeTaskFromQueue(ParallelExecutor.java:154)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor.access$100(ParallelExecutor.java:26)
> at 
> xxxxxxx.ops.executor.util.ParallelExecutor$WorkerTask.doCall(ParallelExecutor.java:164)
> at 
> xxxxxxx.ops.executor.util.UserContextAwareCallable.call(UserContextAwareCallable.java:89)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748) {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to