diff --git a/core/document.cpp b/core/document.cpp index 070c95f8d..5f5069cd6 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -2133,6 +2133,43 @@ void DocumentPrivate::loadSyncFile( const QString & filePath ) m_pagesVector[i]->setSourceReferences( refRects.at(i) ); } +void DocumentPrivate::clearAndWaitForRequests() +{ + m_pixmapRequestsMutex.lock(); + QLinkedList< PixmapRequest * >::const_iterator sIt = m_pixmapRequestsStack.constBegin(); + QLinkedList< PixmapRequest * >::const_iterator sEnd = m_pixmapRequestsStack.constEnd(); + for ( ; sIt != sEnd; ++sIt ) + delete *sIt; + m_pixmapRequestsStack.clear(); + m_pixmapRequestsMutex.unlock(); + + QEventLoop loop; + bool startEventLoop = false; + do + { + m_pixmapRequestsMutex.lock(); + startEventLoop = !m_executingPixmapRequests.isEmpty(); + + if ( m_generator->hasFeature( Generator::SupportsCancelling ) ) + { + for ( PixmapRequest *executingRequest : qAsConst( m_executingPixmapRequests ) ) + executingRequest->d->mShouldAbortRender = 1; + + if ( m_generator->d_ptr->mTextPageGenerationThread ) + m_generator->d_ptr->mTextPageGenerationThread->abortExtraction(); + } + + m_pixmapRequestsMutex.unlock(); + if ( startEventLoop ) + { + m_closingLoop = &loop; + loop.exec(); + m_closingLoop = nullptr; + } + } + while ( startEventLoop ); +} + Document::Document( QWidget *widget ) : QObject( nullptr ), d( new DocumentPrivate( this ) ) { @@ -2548,39 +2585,7 @@ void Document::closeDocument() d->m_scripter = nullptr; // remove requests left in queue - d->m_pixmapRequestsMutex.lock(); - QLinkedList< PixmapRequest * >::const_iterator sIt = d->m_pixmapRequestsStack.constBegin(); - QLinkedList< PixmapRequest * >::const_iterator sEnd = d->m_pixmapRequestsStack.constEnd(); - for ( ; sIt != sEnd; ++sIt ) - delete *sIt; - d->m_pixmapRequestsStack.clear(); - d->m_pixmapRequestsMutex.unlock(); - - QEventLoop loop; - bool startEventLoop = false; - do - { - d->m_pixmapRequestsMutex.lock(); - startEventLoop = !d->m_executingPixmapRequests.isEmpty(); - - if ( d->m_generator->hasFeature( Generator::SupportsCancelling ) ) - { - for ( PixmapRequest *executingRequest : qAsConst( d->m_executingPixmapRequests ) ) - executingRequest->d->mShouldAbortRender = 1; - - if ( d->m_generator->d_ptr->mTextPageGenerationThread ) - d->m_generator->d_ptr->mTextPageGenerationThread->abortExtraction(); - } - - d->m_pixmapRequestsMutex.unlock(); - if ( startEventLoop ) - { - d->m_closingLoop = &loop; - loop.exec(); - d->m_closingLoop = nullptr; - } - } - while ( startEventLoop ); + d->clearAndWaitForRequests(); if ( d->m_fontThread ) { @@ -4491,6 +4496,8 @@ bool Document::swapBackingFile( const QString &newFileName, const QUrl &url ) // Save metadata about the file we're about to close d->saveDocumentInfo(); + d->clearAndWaitForRequests(); + qCDebug(OkularCoreDebug) << "Swapping backing file to" << newFileName; QVector< Page * > newPagesVector; Generator::SwapBackingFileResult result = d->m_generator->swapBackingFile( newFileName, newPagesVector ); diff --git a/core/document_p.h b/core/document_p.h index 66e1d617f..631b86fe8 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -203,6 +203,8 @@ class DocumentPrivate // For sync files void loadSyncFile( const QString & filePath ); + void clearAndWaitForRequests(); + // member variables Document *m_parent; QPointer m_widget; diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 5421c7427..743c09bbf 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1187,29 +1187,27 @@ Okular::TextPage* PDFGenerator::textPage( Okular::TextRequest *request ) // build a TextList... QList textList; double pageWidth, pageHeight; + userMutex()->lock(); Poppler::Page *pp = pdfdoc->page( page->number() ); if (pp) { - userMutex()->lock(); #ifdef HAVE_POPPLER_0_63 TextExtractionPayload payload(request); textList = pp->textList( Poppler::Page::Rotate0, shouldAbortTextExtractionCallback, QVariant::fromValue( &payload ) ); #else textList = pp->textList(); #endif - userMutex()->unlock(); - - QSizeF s = pp->pageSizeF(); + const QSizeF s = pp->pageSizeF(); pageWidth = s.width(); pageHeight = s.height(); - - delete pp; } else { pageWidth = defaultPageWidth; pageHeight = defaultPageHeight; } + delete pp; + userMutex()->unlock(); if ( textList.isEmpty() && request->shouldAbortExtraction() ) return nullptr;