diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-16 00:58:06 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-16 00:58:06 +0200 |
commit | 90f0623b46794af59346b662bc5e823195a0eeff (patch) | |
tree | 5d613e4a636d3fbc266cba4117749c770a66f85b | |
parent | 54e450f7c117e3cbced5773eb732808338b40c0d (diff) | |
download | sink-90f0623b46794af59346b662bc5e823195a0eeff.tar.gz sink-90f0623b46794af59346b662bc5e823195a0eeff.zip |
Cleanup in DummyResourceFacade::load
We avoid capturing resultProvider or queryRunner so they don't live forever.
-rw-r--r-- | dummyresource/facade.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
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<Akonadi2::Storage> storage, c | |||
150 | Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider) | 150 | Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider) |
151 | { | 151 | { |
152 | auto runner = QSharedPointer<QueryRunner>::create(query); | 152 | auto runner = QSharedPointer<QueryRunner>::create(query); |
153 | //The runner only lives as long as the resultProvider | 153 | QWeakPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > weakResultProvider = resultProvider; |
154 | resultProvider->setQueryRunner(runner); | 154 | runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> { |
155 | runner->setQuery([this, resultProvider, query](qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> { | 155 | return Async::start<qint64>([this, weakResultProvider, query](Async::Future<qint64> &future) { |
156 | return Async::start<qint64>([this, resultProvider, query](Async::Future<qint64> &future) { | 156 | auto resultProvider = weakResultProvider.toStrongRef(); |
157 | if (!resultProvider) { | ||
158 | Warning() << "Tried executing query after result provider is already gone"; | ||
159 | future.setError(0, QString()); | ||
160 | future.setFinished(); | ||
161 | return; | ||
162 | } | ||
157 | //TODO only emit changes and don't replace everything | 163 | //TODO only emit changes and don't replace everything |
158 | resultProvider->clear(); | 164 | resultProvider->clear(); |
159 | //rerun query | 165 | //rerun query |
160 | std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1); | 166 | auto addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1); |
161 | load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) { | 167 | load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) { |
162 | //TODO set revision in result provider? | 168 | //TODO set revision in result provider? |
163 | //TODO update all existing results with new revision | 169 | //TODO update all existing results with new revision |
@@ -168,15 +174,14 @@ Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const Q | |||
168 | }); | 174 | }); |
169 | }); | 175 | }); |
170 | 176 | ||
171 | auto resourceAccess = mResourceAccess; | 177 | //In case of a live query we keep the runner for as long alive as the result provider exists |
172 | //TODO we need to somehow disconnect this | 178 | if (query.liveQuery) { |
173 | QObject::connect(resourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, [runner](qint64 newRevision) { | 179 | resultProvider->setQueryRunner(runner); |
174 | runner->revisionChanged(newRevision); | 180 | QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged); |
175 | }); | 181 | } |
176 | 182 | ||
177 | return Async::start<void>([runner](Async::Future<void> &future) { | 183 | return Async::start<void>([runner](Async::Future<void> &future) { |
178 | runner->run().then<void>([&future]() { | 184 | runner->run().then<void>([&future]() { |
179 | //TODO if not live query, destroy runner. | ||
180 | future.setFinished(); | 185 | future.setFinished(); |
181 | }).exec(); | 186 | }).exec(); |
182 | }); | 187 | }); |