CMakeLists.txt | 5 - config.h.cmake | 3 goo/GooMutex.h | 93 ------------------ poppler/Annot.cc | 29 ----- poppler/Annot.h | 9 + poppler/Array.cc | 25 ----- poppler/Array.h | 14 +- poppler/CMap.cc | 26 ----- poppler/CMap.h | 11 -- poppler/CairoFontEngine.cc | 14 -- poppler/CairoFontEngine.h | 6 - poppler/Catalog.cc | 13 -- poppler/Catalog.h | 5 - poppler/CharCodeToUnicode.cc | 29 ----- poppler/CharCodeToUnicode.h | 11 -- poppler/Dict.cc | 19 --- poppler/Dict.h | 9 - poppler/GlobalParams.cc | 203 +++++++++++------------------------------ poppler/GlobalParams.h | 13 -- poppler/GlobalParamsWin.cc | 20 ---- poppler/PDFDoc.cc | 14 -- poppler/PDFDoc.h | 7 - poppler/Page.cc | 13 -- poppler/Page.h | 7 - poppler/Stream.cc | 26 ----- poppler/Stream.h | 14 +- poppler/XRef.cc | 24 ---- poppler/XRef.h | 5 - poppler/poppler-config.h.cmake | 5 - 29 files changed, 121 insertions(+), 551 deletions(-)
New commits: commit e5aff4b4fcbd3e1cbdd7d6329c00eee10b36e94d Author: Adam Reichold <[email protected]> Date: Fri Sep 21 16:31:27 2018 +0200 Remove MULTITHREADED build flag, i.e. always enable threading support based on the C++ standard library and make use of RAII lockers for GlobalParams. diff --git a/CMakeLists.txt b/CMakeLists.txt index f5f9ced3..56036307 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,10 +109,6 @@ else() message(FATAL_ERROR "Invalid font configuration setting: ${FONT_CONFIGURATION}") endif() -if(CMAKE_USE_PTHREADS_INIT OR WIN32) - set(MULTITHREADED ON) -endif() - # Enable these unconditionally. set(OPI_SUPPORT ON) set(TEXTOUT_WORD_LIST ON) diff --git a/config.h.cmake b/config.h.cmake index 10ce5580..194ccc41 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -126,9 +126,6 @@ /* Define as const if the declaration of iconv() needs const. */ #define ICONV_CONST ${ICONV_CONST} -/* Enable multithreading support. */ -#cmakedefine MULTITHREADED 1 - /* Generate OPI comments in PS output. */ #cmakedefine OPI_SUPPORT 1 diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 392aa5ba..a58ad36c 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -82,12 +82,6 @@ #include <string.h> #include <algorithm> -#ifdef MULTITHREADED -# define annotLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define annotLocker() -#endif - #define fieldFlagReadOnly 0x00000001 #define fieldFlagRequired 0x00000002 #define fieldFlagNoExport 0x00000004 @@ -1220,6 +1214,8 @@ double AnnotAppearanceBBox::getPageYMax() const { // Annot //------------------------------------------------------------------------ +#define annotLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + Annot::Annot(PDFDoc *docA, PDFRectangle *rectA) { refCnt = 1; diff --git a/poppler/Annot.h b/poppler/Annot.h index 33c2b65c..5b04e982 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -769,9 +769,7 @@ protected: GBool ok; bool hasRef; -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif }; //------------------------------------------------------------------------ diff --git a/poppler/Array.cc b/poppler/Array.cc index c6df8581..33f6e458 100644 --- a/poppler/Array.cc +++ b/poppler/Array.cc @@ -38,15 +38,12 @@ #include "Object.h" #include "Array.h" -#ifdef MULTITHREADED -# define arrayLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define arrayLocker() -#endif //------------------------------------------------------------------------ // Array //------------------------------------------------------------------------ +#define arrayLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + Array::Array(XRef *xrefA) { xref = xrefA; elems = nullptr; diff --git a/poppler/Array.h b/poppler/Array.h index d7ba1851..ff8755cf 100644 --- a/poppler/Array.h +++ b/poppler/Array.h @@ -85,9 +85,7 @@ private: int size; // size of <elems> array int length; // number of elements in array std::atomic_int ref; // reference count -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif }; #endif diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index b95348bf..b150b0bb 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -60,12 +60,6 @@ #pragma implementation #endif -#ifdef MULTITHREADED -# define fontEngineLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define fontEngineLocker() -#endif - //------------------------------------------------------------------------ // CairoFont //------------------------------------------------------------------------ @@ -802,6 +796,8 @@ CairoType3Font::matches(Ref &other, GBool printingA) { // CairoFontEngine //------------------------------------------------------------------------ +#define fontEngineLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + CairoFontEngine::CairoFontEngine(FT_Library libA) { int i; diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h index 909e2224..60410099 100644 --- a/poppler/CairoFontEngine.h +++ b/poppler/CairoFontEngine.h @@ -127,9 +127,7 @@ private: CairoFont *fontCache[cairoFontCacheSize]; FT_Library lib; GBool useCIDs; -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif }; #endif diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index df692fd6..d9edf6b1 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -66,15 +66,12 @@ #include "FileSpec.h" #include "StructTreeRoot.h" -#ifdef MULTITHREADED -# define catalogLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define catalogLocker() -#endif //------------------------------------------------------------------------ // Catalog //------------------------------------------------------------------------ +#define catalogLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + Catalog::Catalog(PDFDoc *docA) { ok = gTrue; doc = docA; diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 869d16cf..ed058f31 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -291,10 +291,8 @@ private: NameTree *getEmbeddedFileNameTree(); NameTree *getJSNameTree(); LinkDest *createLinkDest(Object *obj); -#ifdef MULTITHREADED - mutable std::recursive_mutex mutex; -#endif + mutable std::recursive_mutex mutex; }; #endif diff --git a/poppler/Dict.cc b/poppler/Dict.cc index 2e013c78..3e14a50d 100644 --- a/poppler/Dict.cc +++ b/poppler/Dict.cc @@ -40,15 +40,12 @@ #include "XRef.h" #include "Dict.h" -#ifdef MULTITHREADED -# define dictLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define dictLocker() -#endif //------------------------------------------------------------------------ // Dict //------------------------------------------------------------------------ +#define dictLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + constexpr int SORT_LENGTH_LOWER_LIMIT = 32; struct Dict::CmpDictEntry { diff --git a/poppler/Dict.h b/poppler/Dict.h index 8271c830..20fd8455 100644 --- a/poppler/Dict.h +++ b/poppler/Dict.h @@ -111,9 +111,7 @@ private: XRef *xref; // the xref table for this PDF file std::vector<DictEntry> entries; std::atomic_int ref; // reference count -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif const DictEntry *find(const char *key) const; DictEntry *find(const char *key); diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index 410b3965..4671495e 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -92,22 +92,6 @@ # include <strings.h> #endif -#ifdef MULTITHREADED -# define lockGlobalParams mutex.lock() -# define lockUnicodeMapCache unicodeMapCacheMutex.lock() -# define lockCMapCache cMapCacheMutex.lock() -# define unlockGlobalParams mutex.unlock() -# define unlockUnicodeMapCache unicodeMapCacheMutex.unlock() -# define unlockCMapCache cMapCacheMutex.unlock() -#else -# define lockGlobalParams -# define lockUnicodeMapCache -# define lockCMapCache -# define unlockGlobalParams -# define unlockUnicodeMapCache -# define unlockCMapCache -#endif - #ifndef FC_WEIGHT_BOOK #define FC_WEIGHT_BOOK 75 #endif @@ -543,6 +527,10 @@ Plugin::~Plugin() { #endif // ENABLE_PLUGINS +#define globalParamsLocker() std::unique_lock<std::recursive_mutex> locker(mutex) +#define unicodeMapCacheLocker() std::unique_lock<std::recursive_mutex> locker(unicodeMapCacheMutex) +#define cMapCacheLocker() std::unique_lock<std::recursive_mutex> locker(cMapCacheMutex) + //------------------------------------------------------------------------ // parsing //------------------------------------------------------------------------ @@ -768,13 +756,12 @@ Unicode GlobalParams::mapNameToUnicodeText(const char *charName) { UnicodeMap *GlobalParams::getResidentUnicodeMap(GooString *encodingName) { UnicodeMap *map = nullptr; - lockGlobalParams; + globalParamsLocker(); const auto unicodeMap = residentUnicodeMaps.find(encodingName->toStr()); if (unicodeMap != residentUnicodeMaps.end()) { map = &unicodeMap->second; map->incRefCnt(); } - unlockGlobalParams; return map; } @@ -782,12 +769,11 @@ UnicodeMap *GlobalParams::getResidentUnicodeMap(GooString *encodingName) { FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) { FILE *file = nullptr; - lockGlobalParams; + globalParamsLocker(); const auto unicodeMap = unicodeMaps.find(encodingName->toStr()); if (unicodeMap != unicodeMaps.end()) { file = openFile(unicodeMap->second.c_str(), "r"); } - unlockGlobalParams; return file; } @@ -795,7 +781,7 @@ FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) { FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) { FILE *file = nullptr; - lockGlobalParams; + globalParamsLocker(); const auto cMapDirs = this->cMapDirs.equal_range(collection->toStr()); for (auto cMapDir = cMapDirs.first; cMapDir != cMapDirs.second; ++cMapDir) { auto* const path = new GooString(cMapDir->second); @@ -806,7 +792,7 @@ FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) { break; } } - unlockGlobalParams; + return file; } @@ -815,18 +801,16 @@ FILE *GlobalParams::findToUnicodeFile(GooString *name) { FILE *f; int i; - lockGlobalParams; + globalParamsLocker(); for (i = 0; i < toUnicodeDirs->getLength(); ++i) { dir = (GooString *)toUnicodeDirs->get(i); fileName = appendToPath(dir->copy(), name->getCString()); f = openFile(fileName->getCString(), "r"); delete fileName; if (f) { - unlockGlobalParams; return f; } } - unlockGlobalParams; return nullptr; } @@ -1008,12 +992,12 @@ GooString *GlobalParams::findFontFile(GooString *fontName) { GooString *path = nullptr; setupBaseFonts(nullptr); - lockGlobalParams; + globalParamsLocker(); const auto fontFile = fontFiles.find(fontName->toStr()); if (fontFile != fontFiles.end()) { path = new GooString(fontFile->second); } - unlockGlobalParams; + return path; } @@ -1041,7 +1025,8 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, const GooString *fontName = font->getName(); GooString substituteName; if (!fontName) return nullptr; - lockGlobalParams; + + globalParamsLocker(); if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gTrue))) { path = fi->path->copy(); @@ -1190,7 +1175,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, fin: if (p) FcPatternDestroy(p); - unlockGlobalParams; + return path; } @@ -1289,96 +1274,60 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, if (!fontName) return nullptr; path = NULL; - lockGlobalParams; + globalParamsLocker(); if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gFalse))) { path = fi->path->copy(); *type = fi->type; *fontNum = fi->fontNum; } - unlockGlobalParams; + return path; } #endif GBool GlobalParams::getPSExpandSmaller() { - GBool f; - - lockGlobalParams; - f = psExpandSmaller; - unlockGlobalParams; - return f; + globalParamsLocker(); + return psExpandSmaller; } GBool GlobalParams::getPSShrinkLarger() { - GBool f; - - lockGlobalParams; - f = psShrinkLarger; - unlockGlobalParams; - return f; + globalParamsLocker(); + return psShrinkLarger; } PSLevel GlobalParams::getPSLevel() { - PSLevel level; - - lockGlobalParams; - level = psLevel; - unlockGlobalParams; - return level; + globalParamsLocker(); + return psLevel; } GooString *GlobalParams::getTextEncodingName() { - GooString *s; - - lockGlobalParams; - s = textEncoding->copy(); - unlockGlobalParams; - return s; + globalParamsLocker(); + return textEncoding->copy(); } EndOfLineKind GlobalParams::getTextEOL() { - EndOfLineKind eol; - - lockGlobalParams; - eol = textEOL; - unlockGlobalParams; - return eol; + globalParamsLocker(); + return textEOL; } GBool GlobalParams::getTextPageBreaks() { - GBool pageBreaks; - - lockGlobalParams; - pageBreaks = textPageBreaks; - unlockGlobalParams; - return pageBreaks; + globalParamsLocker(); + return textPageBreaks; } GBool GlobalParams::getEnableFreeType() { - GBool f; - - lockGlobalParams; - f = enableFreeType; - unlockGlobalParams; - return f; + globalParamsLocker(); + return enableFreeType; } GBool GlobalParams::getPrintCommands() { - GBool p; - - lockGlobalParams; - p = printCommands; - unlockGlobalParams; - return p; + globalParamsLocker(); + return printCommands; } GBool GlobalParams::getProfileCommands() { - GBool p; - - lockGlobalParams; - p = profileCommands; - unlockGlobalParams; - return p; + globalParamsLocker(); + return profileCommands; } GBool GlobalParams::getErrQuiet() { @@ -1390,7 +1339,7 @@ GBool GlobalParams::getErrQuiet() { CharCodeToUnicode *GlobalParams::getCIDToUnicode(GooString *collection) { CharCodeToUnicode *ctu; - lockGlobalParams; + globalParamsLocker(); if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) { const auto cidToUnicode = cidToUnicodes.find(collection->toStr()); if (cidToUnicode != cidToUnicodes.end()) { @@ -1399,7 +1348,7 @@ CharCodeToUnicode *GlobalParams::getCIDToUnicode(GooString *collection) { } } } - unlockGlobalParams; + return ctu; } @@ -1411,20 +1360,16 @@ UnicodeMap *GlobalParams::getUnicodeMap2(GooString *encodingName) { UnicodeMap *map; if (!(map = getResidentUnicodeMap(encodingName))) { - lockUnicodeMapCache; + unicodeMapCacheLocker(); map = unicodeMapCache->getUnicodeMap(encodingName); - unlockUnicodeMapCache; } + return map; } CMap *GlobalParams::getCMap(GooString *collection, GooString *cMapName, Stream *stream) { - CMap *cMap; - - lockCMapCache; - cMap = cMapCache->getCMap(collection, cMapName, stream); - unlockCMapCache; - return cMap; + cMapCacheLocker(); + return cMapCache->getCMap(collection, cMapName, stream); } UnicodeMap *GlobalParams::getTextEncoding() { @@ -1448,38 +1393,33 @@ GooList *GlobalParams::getEncodingNames() //------------------------------------------------------------------------ void GlobalParams::addFontFile(GooString *fontName, GooString *path) { - lockGlobalParams; + globalParamsLocker(); fontFiles[fontName->toStr()] = path->toStr(); - unlockGlobalParams; } void GlobalParams::setPSExpandSmaller(GBool expand) { - lockGlobalParams; + globalParamsLocker(); psExpandSmaller = expand; - unlockGlobalParams; } void GlobalParams::setPSShrinkLarger(GBool shrink) { - lockGlobalParams; + globalParamsLocker(); psShrinkLarger = shrink; - unlockGlobalParams; } void GlobalParams::setPSLevel(PSLevel level) { - lockGlobalParams; + globalParamsLocker(); psLevel = level; - unlockGlobalParams; } void GlobalParams::setTextEncoding(char *encodingName) { - lockGlobalParams; + globalParamsLocker(); delete textEncoding; textEncoding = new GooString(encodingName); - unlockGlobalParams; } GBool GlobalParams::setTextEOL(char *s) { - lockGlobalParams; + globalParamsLocker(); if (!strcmp(s, "unix")) { textEOL = eolUnix; } else if (!strcmp(s, "dos")) { @@ -1487,57 +1427,45 @@ GBool GlobalParams::setTextEOL(char *s) { } else if (!strcmp(s, "mac")) { textEOL = eolMac; } else { - unlockGlobalParams; return gFalse; } - unlockGlobalParams; return gTrue; } void GlobalParams::setTextPageBreaks(GBool pageBreaks) { - lockGlobalParams; + globalParamsLocker(); textPageBreaks = pageBreaks; - unlockGlobalParams; } GBool GlobalParams::setEnableFreeType(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &enableFreeType); - unlockGlobalParams; - return ok; + globalParamsLocker(); + return parseYesNo2(s, &enableFreeType); } void GlobalParams::setOverprintPreview(GBool overprintPreviewA) { - lockGlobalParams; + globalParamsLocker(); overprintPreview = overprintPreviewA; - unlockGlobalParams; } void GlobalParams::setPrintCommands(GBool printCommandsA) { - lockGlobalParams; + globalParamsLocker(); printCommands = printCommandsA; - unlockGlobalParams; } void GlobalParams::setProfileCommands(GBool profileCommandsA) { - lockGlobalParams; + globalParamsLocker(); profileCommands = profileCommandsA; - unlockGlobalParams; } void GlobalParams::setErrQuiet(GBool errQuietA) { - lockGlobalParams; + globalParamsLocker(); errQuiet = errQuietA; - unlockGlobalParams; } void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) { #ifdef ENABLE_PLUGINS - lockGlobalParams; + globalParamsLocker(); securityHandlers->append(handler); - unlockGlobalParams; #endif } @@ -1546,29 +1474,25 @@ XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) { XpdfSecurityHandler *hdlr; int i; - lockGlobalParams; + globalParamsLocker(); for (i = 0; i < securityHandlers->getLength(); ++i) { hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); if (!strcasecmp(hdlr->name, name)) { - unlockGlobalParams; return hdlr; } } - unlockGlobalParams; if (!loadPlugin("security", name)) { return NULL; } - lockGlobalParams; + globalParamsLocker(); for (i = 0; i < securityHandlers->getLength(); ++i) { hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); if (!strcmp(hdlr->name, name)) { - unlockGlobalParams; return hdlr; } } - unlockGlobalParams; #else (void)name; #endif @@ -1587,9 +1511,8 @@ GBool GlobalParams::loadPlugin(char *type, char *name) { if (!(plugin = Plugin::load(type, name))) { return gFalse; } - lockGlobalParams; + globalParamsLocker(); plugins->append(plugin); - unlockGlobalParams; return gTrue; } diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index 4c21ba39..8c4b6a31 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -242,11 +242,9 @@ private: // [XpdfSecurityHandler] #endif -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; mutable std::recursive_mutex unicodeMapCacheMutex; mutable std::recursive_mutex cMapCacheMutex; -#endif const char *popplerDataDir; }; diff --git a/poppler/GlobalParamsWin.cc b/poppler/GlobalParamsWin.cc index 9e041777..5561f531 100644 --- a/poppler/GlobalParamsWin.cc +++ b/poppler/GlobalParamsWin.cc @@ -54,22 +54,6 @@ description for all fonts available in Windows. That's how MuPDF works. #include "Lexer.h" #include "Parser.h" -#ifdef MULTITHREADED -# define lockGlobalParams gLockMutex(&mutex) -# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) -# define lockCMapCache gLockMutex(&cMapCacheMutex) -# define unlockGlobalParams gUnlockMutex(&mutex) -# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) -# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) -#else -# define lockGlobalParams -# define lockUnicodeMapCache -# define lockCMapCache -# define unlockGlobalParams -# define unlockUnicodeMapCache -# define unlockCMapCache -#endif - #define DEFAULT_SUBSTITUTE_FONT "Helvetica" #define DEFAULT_CID_FONT_AC1_MSWIN "MingLiU" /* Adobe-CNS1 for Taiwan, HongKong */ #define DEFAULT_CID_FONT_AG1_MSWIN "SimSun" /* Adobe-GB1 for PRC, Singapore */ @@ -556,7 +540,7 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, GooString *path = nullptr; const GooString *fontName = font->getName(); if (!fontName) return nullptr; - lockGlobalParams; + std::unique_lock<std::recursive_mutex> locker(mutex); setupBaseFonts(nullptr); // TODO: base14Name should be changed? @@ -587,6 +571,6 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, *fontNum = 0; } } - unlockGlobalParams; + return path; } diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index d8b39a75..b0f8a197 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -91,12 +91,6 @@ #include "Hints.h" #include "UTF.h" -#ifdef MULTITHREADED -# define pdfdocLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define pdfdocLocker() -#endif - //------------------------------------------------------------------------ #define headerSearchSize 1024 // read this many bytes at beginning of @@ -114,6 +108,8 @@ // PDFDoc //------------------------------------------------------------------------ +#define pdfdocLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + void PDFDoc::init() { ok = gFalse; diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 1017eaca..11cd4591 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -433,9 +433,7 @@ private: int fopenErrno; Goffset startXRefPos; // offset of last xref table -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif }; #endif diff --git a/poppler/Page.cc b/poppler/Page.cc index ce69c582..f460b7ed 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -61,11 +61,6 @@ #include "Catalog.h" #include "Form.h" -#ifdef MULTITHREADED -# define pageLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define pageLocker() -#endif //------------------------------------------------------------------------ // PDFRectangle //------------------------------------------------------------------------ @@ -248,6 +243,8 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) { // Page //------------------------------------------------------------------------ +#define pageLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + Page::Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) { ok = gTrue; doc = docA; diff --git a/poppler/Page.h b/poppler/Page.h index 2d565e5d..b5559811 100644 --- a/poppler/Page.h +++ b/poppler/Page.h @@ -286,9 +286,7 @@ private: Object actions; // page additional actions double duration; // page duration GBool ok; // true if page is valid -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif }; #endif diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 18e3d337..1dac5216 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -72,12 +72,6 @@ #define permHighResPrint (1<<11) // bit 12 #define defPermFlags 0xfffc -#ifdef MULTITHREADED -# define xrefLocker() std::unique_lock<std::recursive_mutex> locker(mutex) -#else -# define xrefLocker() -#endif - //------------------------------------------------------------------------ // ObjectStream //------------------------------------------------------------------------ @@ -262,6 +256,8 @@ Object ObjectStream::getObject(int objIdx, int objNum) { // XRef //------------------------------------------------------------------------ +#define xrefLocker() std::unique_lock<std::recursive_mutex> locker(mutex) + void XRef::init() { ok = gTrue; errCode = errNone; @@ -1233,15 +1229,11 @@ Object XRef::fetch(int num, int gen, int recursion) { } void XRef::lock() { -#ifdef MULTITHREADED mutex.lock(); -#endif } void XRef::unlock() { -#ifdef MULTITHREADED mutex.unlock(); -#endif } Object XRef::getDocInfo() { diff --git a/poppler/XRef.h b/poppler/XRef.h index 68c507ac..4facedc9 100644 --- a/poppler/XRef.h +++ b/poppler/XRef.h @@ -237,9 +237,7 @@ private: Goffset mainXRefOffset; // position of the main XRef table/stream GBool scannedSpecialFlags; // true if scanSpecialFlags has been called GBool strOwner; // true if str is owned by the instance -#ifdef MULTITHREADED mutable std::recursive_mutex mutex; -#endif void init(); int reserve(int newSize); diff --git a/poppler/poppler-config.h.cmake b/poppler/poppler-config.h.cmake index 20e3dd38..bd93f282 100644 --- a/poppler/poppler-config.h.cmake +++ b/poppler/poppler-config.h.cmake @@ -37,11 +37,6 @@ #define POPPLER_VERSION "${POPPLER_VERSION}" #endif -/* Enable multithreading support. */ -#ifndef MULTITHREADED -#cmakedefine MULTITHREADED 1 -#endif - /* Use fixedpoint. */ #ifndef USE_FIXEDPOINT #cmakedefine USE_FIXEDPOINT 1 commit a38895a1851d9a7a9abd1070bba23fb68708cb78 Author: Adam Reichold <[email protected]> Date: Sat Sep 1 07:20:32 2018 +0200 Replace GooMutex by std::recursive_mutex (and plain reference counter by std::atomic_int). diff --git a/CMakeLists.txt b/CMakeLists.txt index b664e5f3..f5f9ced3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -578,7 +578,6 @@ if(ENABLE_XPDF_HEADERS) install(FILES goo/GooList.h goo/GooTimer.h - goo/GooMutex.h goo/GooString.h goo/gtypes.h goo/gmem.h diff --git a/goo/GooMutex.h b/goo/GooMutex.h deleted file mode 100644 index ed0758fa..00000000 --- a/goo/GooMutex.h +++ /dev/null @@ -1,93 +0,0 @@ -//======================================================================== -// -// GooMutex.h -// -// Portable mutex macros. -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -//======================================================================== -// -// Modified under the Poppler project - http://poppler.freedesktop.org -// -// All changes made under the Poppler project to this file are licensed -// under GPL version 2 or later -// -// Copyright (C) 2009 Kovid Goyal <[email protected]> -// Copyright (C) 2013 Thomas Freitag <[email protected]> -// Copyright (C) 2013, 2018 Albert Astals Cid <[email protected]> -// Copyright (C) 2013 Adam Reichold <[email protected]> -// Copyright (C) 2014 Bogdan Cristea <[email protected]> -// Copyright (C) 2014 Peter Breitenlohner <[email protected]> -// Copyright (C) 2017 Adrian Johnson <[email protected]> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#ifndef GMUTEX_H -#define GMUTEX_H - -#ifdef MULTITHREADED - -// Usage: -// -// GooMutex m; -// gInitMutex(&m); -// ... -// gLockMutex(&m); -// ... critical section ... -// gUnlockMutex(&m); -// ... -// gDestroyMutex(&m); - -#ifdef _WIN32 -#ifndef NOMINMAX -#define NOMINMAX -#endif -#include <windows.h> - -typedef CRITICAL_SECTION GooMutex; - -#define gInitMutex(m) InitializeCriticalSection(m) -#define gDestroyMutex(m) DeleteCriticalSection(m) -#define gLockMutex(m) EnterCriticalSection(m) -#define gUnlockMutex(m) LeaveCriticalSection(m) - -#else // assume pthreads - -#include <pthread.h> - -typedef pthread_mutex_t GooMutex; - -inline void gInitMutex(GooMutex *m) { - pthread_mutexattr_t mutexattr; - pthread_mutexattr_init(&mutexattr); - pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(m, &mutexattr); - pthread_mutexattr_destroy(&mutexattr); -} -#define gDestroyMutex(m) pthread_mutex_destroy(m) -#define gLockMutex(m) pthread_mutex_lock(m) -#define gUnlockMutex(m) pthread_mutex_unlock(m) - -#endif - -class MutexLocker { -public: - MutexLocker(GooMutex *mutexA) : mutex(mutexA) { gLockMutex(mutex); } - ~MutexLocker() { gUnlockMutex(mutex); } - - MutexLocker(const MutexLocker &) = delete; - MutexLocker& operator=(const MutexLocker &other) = delete; - -private: - GooMutex *mutex; -}; - -#endif // MULTITHREADED - -#endif // GMUTEX_H diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 61870bd5..392aa5ba 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -83,11 +83,9 @@ #include <algorithm> #ifdef MULTITHREADED -# define annotLocker() MutexLocker locker(&mutex) -# define annotCondLocker(X) MutexLocker locker(&mutex, (X)) +# define annotLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define annotLocker() -# define annotCondLocker(X) #endif #define fieldFlagReadOnly 0x00000001 @@ -1399,10 +1397,6 @@ void Annot::initialize(PDFDoc *docA, Dict *dict) { } oc = dict->lookupNF("OC"); - -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } void Annot::getRect(double *x1, double *y1, double *x2, double *y2) const { @@ -1634,24 +1628,13 @@ void Annot::removeReferencedObjects() { } void Annot::incRefCnt() { - annotLocker(); refCnt++; } void Annot::decRefCnt() { -#ifdef MULTITHREADED - gLockMutex(&mutex); -#endif if (--refCnt == 0) { -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif delete this; - return; } -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif } Annot::~Annot() { @@ -1675,10 +1658,6 @@ Annot::~Annot() { if (color) delete color; - -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } void AnnotAppearanceBuilder::setDrawColor(const AnnotColor *drawColor, GBool fill) { diff --git a/poppler/Annot.h b/poppler/Annot.h index d564c413..33c2b65c 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -43,6 +43,9 @@ #endif #include <memory> +#include <atomic> +#include <mutex> + #include "Object.h" class XRef; @@ -738,7 +741,7 @@ protected: Object annotObj; - int refCnt; + std::atomic_int refCnt; // required data AnnotSubtype type; // Annotation type @@ -767,7 +770,7 @@ protected: bool hasRef; #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/Array.cc b/poppler/Array.cc index f2dc2363..c6df8581 100644 --- a/poppler/Array.cc +++ b/poppler/Array.cc @@ -39,7 +39,7 @@ #include "Array.h" #ifdef MULTITHREADED -# define arrayLocker() MutexLocker locker(&mutex) +# define arrayLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define arrayLocker() #endif @@ -52,9 +52,6 @@ Array::Array(XRef *xrefA) { elems = nullptr; size = length = 0; ref = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } Array::~Array() { @@ -63,9 +60,6 @@ Array::~Array() { for (i = 0; i < length; ++i) elems[i].free(); gfree(elems); -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } Object Array::copy(XRef *xrefA) const { @@ -77,18 +71,6 @@ Object Array::copy(XRef *xrefA) const { return Object(a); } -int Array::incRef() { - arrayLocker(); - ++ref; - return ref; -} - -int Array::decRef() { - arrayLocker(); - --ref; - return ref; -} - void Array::add(Object &&elem) { arrayLocker(); if (length == size) { diff --git a/poppler/Array.h b/poppler/Array.h index cd71c825..d7ba1851 100644 --- a/poppler/Array.h +++ b/poppler/Array.h @@ -31,9 +31,11 @@ #pragma interface #endif +#include <atomic> +#include <mutex> + #include "poppler-config.h" #include "Object.h" -#include "goo/GooMutex.h" class XRef; @@ -75,16 +77,16 @@ private: friend class Object; // for incRef/decRef // Reference counting. - int incRef(); - int decRef(); + int incRef() { return ++ref; } + int decRef() { return --ref; } XRef *xref; // the xref table for this PDF file Object *elems; // array of elements int size; // size of <elems> array int length; // number of elements in array - int ref; // reference count + std::atomic_int ref; // reference count #ifdef MULTITHREADED - mutable GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/CMap.cc b/poppler/CMap.cc index 614009b7..f38b3c73 100644 --- a/poppler/CMap.cc +++ b/poppler/CMap.cc @@ -313,9 +313,6 @@ CMap::CMap(GooString *collectionA, GooString *cMapNameA) { vector[i].cid = 0; } refCnt = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } CMap::CMap(GooString *collectionA, GooString *cMapNameA, int wModeA) { @@ -325,9 +322,6 @@ CMap::CMap(GooString *collectionA, GooString *cMapNameA, int wModeA) { wMode = wModeA; vector = nullptr; refCnt = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } void CMap::useCMap(CMapCache *cache, char *useName) { @@ -433,9 +427,6 @@ CMap::~CMap() { if (vector) { freeCMapVector(vector); } -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } void CMap::freeCMapVector(CMapVectorEntry *vec) { @@ -450,26 +441,11 @@ void CMap::freeCMapVector(CMapVectorEntry *vec) { } void CMap::incRefCnt() { -#ifdef MULTITHREADED - gLockMutex(&mutex); -#endif ++refCnt; -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif } void CMap::decRefCnt() { - GBool done; - -#ifdef MULTITHREADED - gLockMutex(&mutex); -#endif - done = --refCnt == 0; -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif - if (done) { + if (--refCnt == 0) { delete this; } } diff --git a/poppler/CMap.h b/poppler/CMap.h index eb9893ac..f2f09c99 100644 --- a/poppler/CMap.h +++ b/poppler/CMap.h @@ -29,14 +29,12 @@ #pragma interface #endif +#include <atomic> + #include "poppler-config.h" #include "goo/gtypes.h" #include "CharTypes.h" -#ifdef MULTITHREADED -#include "goo/GooMutex.h" -#endif - class GooString; class Object; struct CMapVectorEntry; @@ -116,10 +114,7 @@ private: int wMode; // writing mode (0=horizontal, 1=vertical) CMapVectorEntry *vector; // vector for first byte (NULL for // identity CMap) - int refCnt; -#ifdef MULTITHREADED - GooMutex mutex; -#endif + std::atomic_int refCnt; }; //------------------------------------------------------------------------ diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index 91deac46..b95348bf 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -61,7 +61,7 @@ #endif #ifdef MULTITHREADED -# define fontEngineLocker() MutexLocker locker(&mutex) +# define fontEngineLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define fontEngineLocker() #endif @@ -815,9 +815,6 @@ CairoFontEngine::CairoFontEngine(FT_Library libA) { FT_Library_Version(lib, &major, &minor, &patch); useCIDs = major > 2 || (major == 2 && (minor > 1 || (minor == 1 && patch > 7))); -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } CairoFontEngine::~CairoFontEngine() { @@ -827,9 +824,6 @@ CairoFontEngine::~CairoFontEngine() { if (fontCache[i]) delete fontCache[i]; } -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } CairoFont * diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h index 601fbae8..909e2224 100644 --- a/poppler/CairoFontEngine.h +++ b/poppler/CairoFontEngine.h @@ -33,6 +33,8 @@ #pragma interface #endif +#include <mutex> + #include "poppler-config.h" #include "goo/gtypes.h" #include <cairo-ft.h> @@ -126,7 +128,7 @@ private: FT_Library lib; GBool useCIDs; #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index 55b7528b..df692fd6 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -67,7 +67,7 @@ #include "StructTreeRoot.h" #ifdef MULTITHREADED -# define catalogLocker() MutexLocker locker(&mutex) +# define catalogLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define catalogLocker() #endif @@ -76,9 +76,6 @@ //------------------------------------------------------------------------ Catalog::Catalog(PDFDoc *docA) { -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif ok = gTrue; doc = docA; xref = doc->getXRef(); @@ -171,9 +168,6 @@ Catalog::~Catalog() { delete optContent; delete viewerPrefs; delete structTreeRoot; -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } GooString *Catalog::readMetadata() { diff --git a/poppler/Catalog.h b/poppler/Catalog.h index 5c8c5070..869d16cf 100644 --- a/poppler/Catalog.h +++ b/poppler/Catalog.h @@ -43,7 +43,6 @@ #include "poppler-config.h" #include "Object.h" -#include "goo/GooMutex.h" #include <vector> @@ -293,7 +292,7 @@ private: NameTree *getJSNameTree(); LinkDest *createLinkDest(Object *obj); #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc index fed6cdb7..c40ee48f 100644 --- a/poppler/CharCodeToUnicode.cc +++ b/poppler/CharCodeToUnicode.cc @@ -488,9 +488,6 @@ CharCodeToUnicode::CharCodeToUnicode() { sMapLen = sMapSize = 0; refCnt = 1; isIdentity = gFalse; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } CharCodeToUnicode::CharCodeToUnicode(GooString *tagA) { @@ -506,9 +503,6 @@ CharCodeToUnicode::CharCodeToUnicode(GooString *tagA) { sMapLen = sMapSize = 0; refCnt = 1; isIdentity = gFalse; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } CharCodeToUnicode::CharCodeToUnicode(GooString *tagA, Unicode *mapA, @@ -528,9 +522,6 @@ CharCodeToUnicode::CharCodeToUnicode(GooString *tagA, Unicode *mapA, sMapSize = sMapSizeA; refCnt = 1; isIdentity = gFalse; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } CharCodeToUnicode::~CharCodeToUnicode() { @@ -542,32 +533,14 @@ CharCodeToUnicode::~CharCodeToUnicode() { for (int i = 0; i < sMapLen; ++i) gfree(sMap[i].u); gfree(sMap); } -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } void CharCodeToUnicode::incRefCnt() { -#ifdef MULTITHREADED - gLockMutex(&mutex); -#endif ++refCnt; -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif } void CharCodeToUnicode::decRefCnt() { - GBool done; - -#ifdef MULTITHREADED - gLockMutex(&mutex); -#endif - done = --refCnt == 0; -#ifdef MULTITHREADED - gUnlockMutex(&mutex); -#endif - if (done) { + if (--refCnt == 0) { delete this; } } diff --git a/poppler/CharCodeToUnicode.h b/poppler/CharCodeToUnicode.h index 5a10fa24..e726176f 100644 --- a/poppler/CharCodeToUnicode.h +++ b/poppler/CharCodeToUnicode.h @@ -34,14 +34,12 @@ #pragma interface #endif +#include <atomic> + #include "poppler-config.h" #include "CharTypes.h" #include "goo/gtypes.h" -#ifdef MULTITHREADED -#include "goo/GooMutex.h" -#endif - struct CharCodeToUnicodeString; class GooString; @@ -120,11 +118,8 @@ private: CharCode mapLen; CharCodeToUnicodeString *sMap; int sMapLen, sMapSize; - int refCnt; + std::atomic_int refCnt; GBool isIdentity; -#ifdef MULTITHREADED - GooMutex mutex; -#endif }; //------------------------------------------------------------------------ diff --git a/poppler/Dict.cc b/poppler/Dict.cc index 0a0ceab3..2e013c78 100644 --- a/poppler/Dict.cc +++ b/poppler/Dict.cc @@ -41,7 +41,7 @@ #include "Dict.h" #ifdef MULTITHREADED -# define dictLocker() MutexLocker locker(&mutex) +# define dictLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define dictLocker() #endif @@ -66,9 +66,6 @@ struct Dict::CmpDictEntry { Dict::Dict(XRef *xrefA) { xref = xrefA; ref = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif sorted = false; } @@ -76,9 +73,6 @@ Dict::Dict(XRef *xrefA) { Dict::Dict(const Dict* dictA) { xref = dictA->xref; ref = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif entries.reserve(dictA->entries.size()); for (const auto& entry : dictA->entries) { @@ -100,12 +94,6 @@ Dict *Dict::copy(XRef *xrefA) const { return dictA; } -Dict::~Dict() { -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - void Dict::add(const char *key, Object &&val) { dictLocker(); entries.emplace_back(key, std::move(val)); diff --git a/poppler/Dict.h b/poppler/Dict.h index a4fd1c56..8271c830 100644 --- a/poppler/Dict.h +++ b/poppler/Dict.h @@ -35,13 +35,13 @@ #endif #include <atomic> +#include <mutex> #include <string> #include <vector> #include <utility> #include "poppler-config.h" #include "Object.h" -#include "goo/GooMutex.h" //------------------------------------------------------------------------ // Dict @@ -55,9 +55,6 @@ public: Dict(const Dict *dictA); Dict *copy(XRef *xrefA) const; - // Destructor. - ~Dict(); - Dict(const Dict &) = delete; Dict& operator=(const Dict &) = delete; @@ -115,7 +112,7 @@ private: std::vector<DictEntry> entries; std::atomic_int ref; // reference count #ifdef MULTITHREADED - mutable GooMutex mutex; + mutable std::recursive_mutex mutex; #endif const DictEntry *find(const char *key) const; diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index c1131df3..410b3965 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -93,12 +93,12 @@ #endif #ifdef MULTITHREADED -# define lockGlobalParams gLockMutex(&mutex) -# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) -# define lockCMapCache gLockMutex(&cMapCacheMutex) -# define unlockGlobalParams gUnlockMutex(&mutex) -# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) -# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) +# define lockGlobalParams mutex.lock() +# define lockUnicodeMapCache unicodeMapCacheMutex.lock() +# define lockCMapCache cMapCacheMutex.lock() +# define unlockGlobalParams mutex.unlock() +# define unlockUnicodeMapCache unicodeMapCacheMutex.unlock() +# define unlockCMapCache cMapCacheMutex.unlock() #else # define lockGlobalParams # define lockUnicodeMapCache @@ -550,12 +550,6 @@ Plugin::~Plugin() { GlobalParams::GlobalParams(const char *customPopplerDataDir) : popplerDataDir(customPopplerDataDir) { -#ifdef MULTITHREADED - gInitMutex(&mutex); - gInitMutex(&unicodeMapCacheMutex); - gInitMutex(&cMapCacheMutex); -#endif - initBuiltinFontTables(); // scan the encoding in reverse because we want the lowest-numbered @@ -747,12 +741,6 @@ GlobalParams::~GlobalParams() { delete securityHandlers; deleteGooList(plugins, Plugin); #endif - -#ifdef MULTITHREADED - gDestroyMutex(&mutex); - gDestroyMutex(&unicodeMapCacheMutex); - gDestroyMutex(&cMapCacheMutex); -#endif } //------------------------------------------------------------------------ diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index 37124f6b..4c21ba39 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -48,10 +48,7 @@ #include "UnicodeMap.h" #include <unordered_map> #include <string> - -#ifdef MULTITHREADED -#include "goo/GooMutex.h" -#endif +#include <mutex> class GooString; class GooList; @@ -246,9 +243,9 @@ private: #endif #ifdef MULTITHREADED - GooMutex mutex; - GooMutex unicodeMapCacheMutex; - GooMutex cMapCacheMutex; + mutable std::recursive_mutex mutex; + mutable std::recursive_mutex unicodeMapCacheMutex; + mutable std::recursive_mutex cMapCacheMutex; #endif const char *popplerDataDir; diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index cb8fd0d7..d8b39a75 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -92,7 +92,7 @@ #include "UTF.h" #ifdef MULTITHREADED -# define pdfdocLocker() MutexLocker locker(&mutex) +# define pdfdocLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define pdfdocLocker() #endif @@ -116,9 +116,6 @@ void PDFDoc::init() { -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif ok = gFalse; errCode = errNone; fileName = nullptr; @@ -368,9 +365,6 @@ PDFDoc::~PDFDoc() { gfree(fileNameU); } #endif -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 3353db74..1017eaca 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -45,9 +45,10 @@ #pragma interface #endif +#include <mutex> + #include "poppler-config.h" #include <stdio.h> -#include "goo/GooMutex.h" #include "XRef.h" #include "Catalog.h" #include "Page.h" @@ -433,7 +434,7 @@ private: Goffset startXRefPos; // offset of last xref table #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/Page.cc b/poppler/Page.cc index d4799dd1..ce69c582 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -62,7 +62,7 @@ #include "Form.h" #ifdef MULTITHREADED -# define pageLocker() MutexLocker locker(&mutex) +# define pageLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define pageLocker() #endif @@ -249,9 +249,6 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) { //------------------------------------------------------------------------ Page::Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) { -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif ok = gTrue; doc = docA; xref = doc->getXRef(); @@ -328,9 +325,6 @@ Page::Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *at Page::~Page() { delete attrs; delete annots; -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } Dict *Page::getResourceDict() { diff --git a/poppler/Page.h b/poppler/Page.h index 7151ee5b..2d565e5d 100644 --- a/poppler/Page.h +++ b/poppler/Page.h @@ -36,9 +36,10 @@ #pragma interface #endif +#include <mutex> + #include "poppler-config.h" #include "Object.h" -#include "goo/GooMutex.h" class Dict; class PDFDoc; @@ -286,7 +287,7 @@ private: double duration; // page duration GBool ok; // true if page is valid #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif }; diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 2c55f295..05c1530d 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -94,39 +94,15 @@ static GBool setDJSYSFLAGS = gFalse; #endif #endif -#ifdef MULTITHREADED -# define streamLocker() MutexLocker locker(&mutex) -#else -# define streamLocker() -#endif //------------------------------------------------------------------------ // Stream (base class) //------------------------------------------------------------------------ Stream::Stream() { ref = 1; -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif } -Stream::~Stream() { -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -int Stream::incRef() { - streamLocker(); - ++ref; - return ref; -} - -int Stream::decRef() { - streamLocker(); - --ref; - return ref; -} +Stream::~Stream() = default; void Stream::close() { } diff --git a/poppler/Stream.h b/poppler/Stream.h index 841c87a8..0b78f87a 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -39,11 +39,12 @@ #pragma interface #endif +#include <atomic> +#include <cstdio> + #include "poppler-config.h" -#include <stdio.h> #include "goo/gtypes.h" #include "Object.h" -#include "goo/GooMutex.h" class GooFile; class BaseStream; @@ -232,18 +233,15 @@ private: friend class Object; // for incRef/decRef // Reference counting. - int incRef(); - int decRef(); + int incRef() { return ++ref; } + int decRef() { return --ref; } virtual GBool hasGetChars() { return false; } virtual int getChars(int nChars, Guchar *buffer); Stream *makeFilter(const char *name, Stream *str, Object *params, int recursion = 0, Dict *dict = nullptr); - int ref; // reference count -#ifdef MULTITHREADED - GooMutex mutex; -#endif + std::atomic_int ref; // reference count }; diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 078274b4..18e3d337 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -73,11 +73,9 @@ #define defPermFlags 0xfffc #ifdef MULTITHREADED -# define xrefLocker() MutexLocker locker(&mutex) -# define xrefCondLocker(X) MutexLocker locker(&mutex, (X)) +# define xrefLocker() std::unique_lock<std::recursive_mutex> locker(mutex) #else # define xrefLocker() -# define xrefCondLocker(X) #endif //------------------------------------------------------------------------ @@ -265,9 +263,6 @@ Object ObjectStream::getObject(int objIdx, int objNum) { //------------------------------------------------------------------------ void XRef::init() { -#ifdef MULTITHREADED - gInitMutex(&mutex); -#endif ok = gTrue; errCode = errNone; entries = nullptr; @@ -388,9 +383,6 @@ XRef::~XRef() { if (strOwner) { delete str; } -#ifdef MULTITHREADED - gDestroyMutex(&mutex); -#endif } XRef *XRef::copy() const { @@ -1242,13 +1234,13 @@ Object XRef::fetch(int num, int gen, int recursion) { void XRef::lock() { #ifdef MULTITHREADED - gLockMutex(&mutex); + mutex.lock(); #endif } void XRef::unlock() { #ifdef MULTITHREADED - gUnlockMutex(&mutex); + mutex.unlock(); #endif } diff --git a/poppler/XRef.h b/poppler/XRef.h index bf904d50..68c507ac 100644 --- a/poppler/XRef.h +++ b/poppler/XRef.h @@ -38,7 +38,6 @@ #include "poppler-config.h" #include "goo/gtypes.h" -#include "goo/GooMutex.h" #include "Object.h" #include "Stream.h" @@ -239,7 +238,7 @@ private: GBool scannedSpecialFlags; // true if scanSpecialFlags has been called GBool strOwner; // true if str is owned by the instance #ifdef MULTITHREADED - GooMutex mutex; + mutable std::recursive_mutex mutex; #endif void init(); _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
