Hi Michal,

Unfortunately, without memory barriers, DCLP as found in these places is not 
correct on x64 either, and I would not want to rely on std::lock::lock() 
containing fences. As I said, the worst thing likely to happen in practice is 
that two encoding objects are allocated, as writing a pointer to aligned memory 
is going to be an atomic operation in virtually all cases.

Personally, I would either use the safe form where available or just initialize 
all the encoding classes statically:

Option 1:

const PdfEncoding* PdfEncodingFactory::GlobalPdfDocEncodingInstance()
{
#if __cplusplus >= 201103L

    static PdfDocEncoding docEncoding;
    return &docEncoding;

#else // pre-C++11

    if(!s_pDocEncoding) // First check
    {
        Util::PdfMutexWrapper wrapper( PdfEncodingFactory::s_mutex );

        if(!s_pDocEncoding) // Double check
            s_pDocEncoding = new PdfDocEncoding();
    }

    return s_pDocEncoding;

#endif
}


Option 2:

class PODOFO_API PdfEncodingFactory {
…
private:
    static const PdfDocEncoding docEnconding;
…
}

const PdfEncoding* PdfEncodingFactory::GlobalPdfDocEncodingInstance()
{
    return &docEncoding;
}


Cheers,
Christopher

From: Michal Sudolsky <sudols...@gmail.com>
Sent: Tuesday, May 4, 2021 17:08
To: Christopher Creutzig <ccreu...@mathworks.com>
Cc: podofo-users@lists.sourceforge.net
Subject: Re: [Podofo-users] DCLP in PoDoFo

Hi,

See: 
https://sourceforge.net/p/podofo/mailman/message/35915862/<https://sourceforge.net/p/podofo/mailman/message/35915862/>

On Mon, May 3, 2021 at 2:05 PM Christopher Creutzig 
<ccreu...@mathworks.com<mailto:ccreu...@mathworks.com>> wrote:
Hi list,

PdfEncodingFactory.cpp uses a broken form of double-checked 
locking<https://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/>
 to initialize its encoding instances. Not a big deal, as these objects don’t 
do much; technically, that is a data race and can lead to undefined behaviour, 
but realistically, I would be surprised to see anything worse than a small 
memory leak, if even that.

It is undefined behaviour in C++. Actually it should cause problems only on 
weakly ordered processors like ARM. So you should never see it on x64.


Does PoDoFo require C++11 or newer (where there are simple fixes available)? 
Will it ever?

If podofo cannot depend on C++11 then I would suggest to use "single"-checked 
locking (just remove the first check):

    //if(!s_pWinAnsiEncoding) // First check
    //{
        Util::PdfMutexWrapper wrapper( PdfEncodingFactory::s_mutex );

        if(!s_pWinAnsiEncoding) // Double check
            s_pWinAnsiEncoding = new PdfWinAnsiEncoding();
    //}

    return s_pWinAnsiEncoding;

Another solution would be to use some additional library that provides atomic 
primitives for older C++ but I do not think that it would be worth it in this 
case.




Cheers,
Christopher

The MathWorks GmbH | Friedlandstr.18 | 52064 Aachen | District Court Aachen | 
HRB 8082 | Managing Directors: Bertrand Dissler, Steven D. Barbo, Jeanne O’Keefe

_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net<mailto:Podofo-users@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/podofo-users<https://lists.sourceforge.net/lists/listinfo/podofo-users>
_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to