Hi,
There are many initialised static local variables which is thread-safe only
in C++11 and above what is ok.
What is not ok is that there are two class member static variables which
are initialised lazily in some member function.
These cases are definitely not thread-safe. There should be mutex at least
or they could be simply declared non-static.
PdfCanvas:
private:
> /** The procset is the same for all
> * PdfContents objects
> */
> *static **PdfArray s_procset;*
> const PdfArray & PdfCanvas::GetProcSet()
> {
> if( s_procset.empty() )
> {
> s_procset.push_back( PdfName( "PDF" ) );
> s_procset.push_back( PdfName( "Text" ) );
> s_procset.push_back( PdfName( "ImageB" ) );
> s_procset.push_back( PdfName( "ImageC" ) );
> s_procset.push_back( PdfName( "ImageI" ) );
> }
> return s_procset;
> }
PdfXObject:
private:
> *static **PdfArray s_matrix;*
void PdfXObject::InitXObject( const PdfRect & rRect, const char* pszPrefix )
> {
> PdfVariant var;
> ostringstream out;
> PdfLocaleImbue(out);
// Initialize static data
> if( s_matrix.empty() )
> {
> // This matrix is the same for all PdfXObjects so cache it
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(1)) ) );
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(0)) ) );
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(0)) ) );
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(1)) ) );
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(0)) ) );
> s_matrix.push_back( PdfVariant( static_cast<pdf_int64>(
> PODOFO_LL_LITERAL(0)) ) );
> }
This DLCP singleton is also not thread-safe on weakly ordered processors:
const PdfEncoding* PdfEncodingFactory::GlobalPdfDocEncodingInstance()
> {
> if(!s_pDocEncoding) // First check
> {
> Util::PdfMutexWrapper wrapper( PdfEncodingFactory::s_mutex );
>
> if(!s_pDocEncoding) // Double check
> s_pDocEncoding = new PdfDocEncoding();
> }
> return s_pDocEncoding;
> }
Can be fixed in C++11 http://preshing.com/20130930/double-checked-
locking-is-fixed-in-cpp11/
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/podofo-users