diff --git a/dsl.cc b/dsl.cc index 164a42fe4..b7ffbf34f 100644 --- a/dsl.cc +++ b/dsl.cc @@ -56,6 +56,8 @@ // For SVG handling #include +#include + #include "utils.hh" namespace Dsl { @@ -1561,6 +1563,7 @@ class DslArticleRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -1569,7 +1572,8 @@ class DslArticleRequest: public Dictionary::DataRequest DslDictionary & dict_, bool ignoreDiacritics_ ): word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ ) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); } void run(); @@ -1582,6 +1586,7 @@ class DslArticleRequest: public Dictionary::DataRequest ~DslArticleRequest() { isCancelled.ref(); + f.waitForFinished(); //hasExited.acquire(); } }; @@ -1733,6 +1738,7 @@ class DslResourceRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -1741,7 +1747,8 @@ class DslResourceRequest: public Dictionary::DataRequest dict( dict_ ), resourceName( resourceName_ ) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); } void run(); @@ -1754,6 +1761,7 @@ class DslResourceRequest: public Dictionary::DataRequest ~DslResourceRequest() { isCancelled.ref(); + f.waitForFinished(); //hasExited.acquire(); } }; diff --git a/epwing.cc b/epwing.cc index 2f9ef6077..bdb1d28be 100644 --- a/epwing.cc +++ b/epwing.cc @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -461,6 +462,7 @@ class EpwingArticleRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -469,8 +471,9 @@ class EpwingArticleRequest: public Dictionary::DataRequest EpwingDictionary & dict_, bool ignoreDiacritics_ ): word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ ) { - QThreadPool::globalInstance()->start( - new EpwingArticleRequestRunnable( *this, hasExited ) ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( + // new EpwingArticleRequestRunnable( *this, hasExited ) ); } void run(); // Run from another thread by EpwingArticleRequestRunnable @@ -483,7 +486,8 @@ class EpwingArticleRequest: public Dictionary::DataRequest ~EpwingArticleRequest() { isCancelled.ref(); - hasExited.acquire(); + f.waitForFinished(); + // hasExited.acquire(); } }; diff --git a/ftshelpers.cc b/ftshelpers.cc index 29bf509ac..680ace671 100644 --- a/ftshelpers.cc +++ b/ftshelpers.cc @@ -443,27 +443,19 @@ void FTSResultsRequest::checkArticles( QVector< uint32_t > const & offsets, QStringList const & words, QRegExp const & searchRegexp ) { - const int parallel_count = QThread::idealThreadCount()/2; - QSemaphore sem( parallel_count < 1 ? 1 : parallel_count ); - - QFutureSynchronizer< void > synchronizer; + // const int parallel_count = QThread::idealThreadCount()/2; + // QSemaphore sem( parallel_count < 1 ? 1 : parallel_count ); + // + // QFutureSynchronizer< void > synchronizer; const auto searchRegularExpression = createMatchRegex( searchRegexp ); for( auto & address : offsets ) { if( Utils::AtomicInt::loadAcquire( isCancelled ) ) { - synchronizer.setCancelOnWait(true); return; } - sem.acquire(); - QFuture< void > f = QtConcurrent::run( - [ =,&sem ]() - { - QSemaphoreReleaser releaser( sem ); - checkSingleArticle( address, words, searchRegularExpression ); - } ); - synchronizer.addFuture( f ); + checkSingleArticle( address, words, searchRegularExpression ); } } @@ -723,7 +715,18 @@ void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, } }; // int n = indexWords.length(); - QtConcurrent::blockingMap( indexWords, findLinks ); + // QtConcurrent::blockingMap( indexWords, findLinks ); + + for(QString word:indexWords) + { + if( Utils::AtomicInt::loadAcquire( isCancelled ) ) + { + return; + } + findLinks( word ); + } + + // blocked execution. int i = 0; for( auto & elem : addressLists ) @@ -807,6 +810,7 @@ void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsInde { if( Utils::AtomicInt::loadAcquire( isCancelled ) ) { + Mutex::Lock _( dataMutex ); sets << tmp; return; } @@ -839,7 +843,20 @@ void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsInde sets << tmp; } }; - QtConcurrent::blockingMap( wordsList, fn_wordLink ); + // QtConcurrent::blockingMap( wordsList, fn_wordLink ); + + { + + for(const auto & word : wordsList ) + { + if( Utils::AtomicInt::loadAcquire( isCancelled ) ) + { + return; + } + fn_wordLink( word ); + } + } + //blocked execution. int i = 0; for( auto & elem : sets ) diff --git a/ftshelpers.hh b/ftshelpers.hh index 5a5ac6ea0..cf02a06c0 100644 --- a/ftshelpers.hh +++ b/ftshelpers.hh @@ -10,6 +10,7 @@ #include #include #include +#include #include "dictionary.hh" #include "btreeidx.hh" @@ -83,6 +84,7 @@ class FTSResultsRequest : public Dictionary::DataRequest QAtomicInt isCancelled; QAtomicInt results; + QFuture< void > f; QList< FTS::FtsHeadword > * foundHeadwords; @@ -135,7 +137,8 @@ public: foundHeadwords = new QList< FTS::FtsHeadword >; results = 0; - QThreadPool::globalInstance()->start( [ this ]() { this->run(); }, -100 ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); }, -100 ); } void run(); @@ -148,6 +151,7 @@ public: ~FTSResultsRequest() { isCancelled.ref(); + f.waitForFinished(); if( foundHeadwords ) delete foundHeadwords; } diff --git a/mdx.cc b/mdx.cc index b096959c0..fb1df58fd 100644 --- a/mdx.cc +++ b/mdx.cc @@ -43,6 +43,7 @@ #include "tiff.hh" #include "utils.hh" #include "base/globalregex.hh" +#include namespace Mdx { @@ -173,17 +174,23 @@ class IndexedMdd: public BtreeIndexing::BtreeIndex return false; } - ScopedMemMap compressed( mddFile, indexEntry.compressedBlockPos, indexEntry.compressedBlockSize ); - if ( !compressed.startAddress() ) - { - return false; - } - QByteArray decompressed; - if ( !MdictParser::parseCompressedBlock( indexEntry.compressedBlockSize, ( char * )compressed.startAddress(), - indexEntry.decompressedBlockSize, decompressed ) ) + { - return false; + Mutex::Lock _( idxMutex ); + ScopedMemMap compressed( mddFile, indexEntry.compressedBlockPos, indexEntry.compressedBlockSize ); + if( !compressed.startAddress() ) + { + return false; + } + + if( !MdictParser::parseCompressedBlock( indexEntry.compressedBlockSize, + (char *)compressed.startAddress(), + indexEntry.decompressedBlockSize, + decompressed ) ) + { + return false; + } } result.resize( indexEntry.recordSize ); @@ -527,6 +534,7 @@ class MdxArticleRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -539,7 +547,8 @@ class MdxArticleRequest: public Dictionary::DataRequest dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ ) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( ); } void run(); @@ -552,7 +561,8 @@ class MdxArticleRequest: public Dictionary::DataRequest ~MdxArticleRequest() { isCancelled.ref(); - //hasExited.acquire(); + f.waitForFinished(); + // hasExited.acquire(); } }; @@ -681,6 +691,7 @@ class MddResourceRequest: public Dictionary::DataRequest wstring resourceName; QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -689,7 +700,8 @@ class MddResourceRequest: public Dictionary::DataRequest dict( dict_ ), resourceName( Utf8::decode( resourceName_ ) ) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); } void run(); @@ -702,6 +714,7 @@ class MddResourceRequest: public Dictionary::DataRequest ~MddResourceRequest() { isCancelled.ref(); + f.waitForFinished(); //hasExited.acquire(); } }; diff --git a/zim.cc b/zim.cc index 6dc8a9b14..de827bfcf 100644 --- a/zim.cc +++ b/zim.cc @@ -41,6 +41,7 @@ #include #include #include +#include namespace Zim { @@ -1248,6 +1249,7 @@ class ZimArticleRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: @@ -1256,7 +1258,8 @@ class ZimArticleRequest: public Dictionary::DataRequest ZimDictionary & dict_, bool ignoreDiacritics_ ): word( word_ ), alts( alts_ ), dict( dict_ ), ignoreDiacritics( ignoreDiacritics_ ) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); } void run(); @@ -1269,6 +1272,7 @@ class ZimArticleRequest: public Dictionary::DataRequest ~ZimArticleRequest() { isCancelled.ref(); + f.waitForFinished(); //hasExited.acquire(); } }; @@ -1421,11 +1425,13 @@ class ZimResourceRequest: public Dictionary::DataRequest QAtomicInt isCancelled; QSemaphore hasExited; + QFuture< void > f; public: ZimResourceRequest(ZimDictionary &dict_, string const &resourceName_) : dict(dict_), resourceName(resourceName_) { - QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); + f = QtConcurrent::run( [ this ]() { this->run(); } ); + // QThreadPool::globalInstance()->start( [ this ]() { this->run(); } ); } void run(); @@ -1438,6 +1444,7 @@ class ZimResourceRequest: public Dictionary::DataRequest ~ZimResourceRequest() { isCancelled.ref(); + f.waitForFinished(); //hasExited.acquire(); } };