From 90f0623b46794af59346b662bc5e823195a0eeff Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 16 Apr 2015 00:58:06 +0200 Subject: Cleanup in DummyResourceFacade::load We avoid capturing resultProvider or queryRunner so they don't live forever. --- dummyresource/facade.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'dummyresource/facade.cpp') diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp index 1e0f20a..da2a27a 100644 --- a/dummyresource/facade.cpp +++ b/dummyresource/facade.cpp @@ -150,14 +150,20 @@ void DummyResourceFacade::readValue(QSharedPointer storage, c Async::Job DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) { auto runner = QSharedPointer::create(query); - //The runner only lives as long as the resultProvider - resultProvider->setQueryRunner(runner); - runner->setQuery([this, resultProvider, query](qint64 oldRevision, qint64 newRevision) -> Async::Job { - return Async::start([this, resultProvider, query](Async::Future &future) { + QWeakPointer > weakResultProvider = resultProvider; + runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> Async::Job { + return Async::start([this, weakResultProvider, query](Async::Future &future) { + auto resultProvider = weakResultProvider.toStrongRef(); + if (!resultProvider) { + Warning() << "Tried executing query after result provider is already gone"; + future.setError(0, QString()); + future.setFinished(); + return; + } //TODO only emit changes and don't replace everything resultProvider->clear(); //rerun query - std::function addCallback = std::bind(&Akonadi2::ResultProvider::add, resultProvider, std::placeholders::_1); + auto addCallback = std::bind(&Akonadi2::ResultProvider::add, resultProvider, std::placeholders::_1); load(query, addCallback).then([resultProvider, &future](qint64 queriedRevision) { //TODO set revision in result provider? //TODO update all existing results with new revision @@ -168,15 +174,14 @@ Async::Job DummyResourceFacade::load(const Akonadi2::Query &query, const Q }); }); - auto resourceAccess = mResourceAccess; - //TODO we need to somehow disconnect this - QObject::connect(resourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, [runner](qint64 newRevision) { - runner->revisionChanged(newRevision); - }); + //In case of a live query we keep the runner for as long alive as the result provider exists + if (query.liveQuery) { + resultProvider->setQueryRunner(runner); + QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged); + } return Async::start([runner](Async::Future &future) { runner->run().then([&future]() { - //TODO if not live query, destroy runner. future.setFinished(); }).exec(); }); -- cgit v1.2.3