Am 27.06.2016 um 22:01 schrieb Stahle, Patrick:
Hi Tilman,

How would a call contains?

I meant put this in your software before multithreading starts:

PDType1Font.HELVETICA.getEncoding().contains("space");





Right now I am just doing the following font wise:
font = PDType1Font.HELVETICA;

Yes this is OK.


Should I simply grab the fonts we use during single thread initialization code?

Can't follow you there.

What I also noticed is that each standard 14 font is allocating a WinAnsiEncoding object despite WinAnsiEncoding.INSTANCE already being assigned.

Anyway, can you test that workaround? I'm thinking about a code change like this:

    public boolean contains(String name)
    {
// we have to wait until all add() calls are done before building the name cache
        // otherwise /Differences won't be accounted for
        if (names == null)
        {
            synchronized (this)
            {
                if (names == null)
                {
                    names = new HashSet<String>(codeToName.size());
                    names.addAll(codeToName.values());
                }
            }
        }
        return names.contains(name);
    }


This way, there is no performance loss except the very first time.

Tilman


Thanks,
Patrick



-----Original Message-----
From: Stahle, Patrick [mailto:[email protected]]
Sent: Monday, June 27, 2016 3:27 PM
To: [email protected]
Subject: RE: threads using PDFBox getting stuck infinite loop

Hi Tilman,

We are using  "PDType1Font.HELVETICA".

Thanks,
Patrick


-----Original Message-----
From: Tilman Hausherr [mailto:[email protected]]
Sent: Monday, June 27, 2016 3:17 PM
To: [email protected]
Subject: Re: threads using PDFBox getting stuck infinite loop

Am 27.06.2016 um 20:55 schrieb Stahle, Patrick:
Hi,

We have a relatively heavily threaded application which is calling pdfbox to 
stamp certain pdf files. We have been in production for a little over a week 
and have run into a few threads getting stuck. The stack trace is the following:

### Thread id=34, name="dispatch_2_20160626211454_1064"
# ThreadInfo: "dispatch_2_20160626211454_1064" Id=34 RUNNABLE # CPU:
threadCpuTime=49,541,548.824 ms, threadUserTime=49,538,533.066 ms #
Contention: blockedCount=33 , blockedTime=123 ms # Contention:
lockName=null , lockOwnerId=-1, lockOwnerName=null
java.util.HashMap.put(HashMap.java:473)
java.util.HashSet.add(HashSet.java:217)
java.util.AbstractCollection.addAll(AbstractCollection.java:334)
org.apache.pdfbox.pdmodel.font.encoding.Encoding.contains(Encoding.jav
a:109)
org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:343
)
org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:286)
org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:315)
com.tycoelectronics.emcs.stamppdf.StampEnginePDFBox.getLongestTextWidt
h(StampEnginePDFBox.java:1369)
:
:

We seem to be getting stuck in PDFont classes HashMap which is unsynchronized 
class.

Any suggestions?

We are using PDFBox 2.0.0 release...
Update to 2.0.2. What PDFont are you using? One of the predefined "standard 
14"? If yes, then this code

      public boolean contains(String name)
      {
          // we have to wait until all add() calls are done before building the 
name cache
          // otherwise /Differences won't be accounted for
          if (names == null)
          {
              names = new HashSet<String>(codeToName.size());
              names.addAll(codeToName.values());
          }
          return names.contains(name);
      }

might be risky :-( Workaround idea: call contains("space") for the fonts you're 
using before the real business starts.

Tilman

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


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


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



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

Reply via email to