try to fix memoery leak

This commit is contained in:
Martchus 2016-03-01 20:32:20 +01:00
parent 9325b11f60
commit b7dc98aefa
2 changed files with 16 additions and 5 deletions

View File

@ -112,16 +112,18 @@ PackageLoader *Repository::init()
QWriteLocker locker(lock()); QWriteLocker locker(lock());
// wipe current packages // wipe current packages
wipePackages(); wipePackages();
if(PackageLoader *loader = internalInit()) { m_loader.reset(internalInit());
if(loader->future().isRunning()) { if(m_loader) {
if(m_loader->future().isRunning()) {
auto watcher = new QFutureWatcher<void>; auto watcher = new QFutureWatcher<void>;
connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::updateGroups); connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::updateGroups);
connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::removeBusyFlag); connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::removeBusyFlag);
connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::initialized); connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::initialized);
connect(watcher, &QFutureWatcher<void>::finished, watcher, &QFutureWatcher<void>::deleteLater); connect(watcher, &QFutureWatcher<void>::finished, watcher, &QFutureWatcher<void>::deleteLater);
watcher->setFuture(loader->future()); connect(watcher, &QFutureWatcher<void>::finished, this, &Repository::discardPackageLoader);
watcher->setFuture(m_loader->future());
} }
return loader; return m_loader.get();
} else { } else {
updateGroups(); updateGroups();
removeBusyFlag(); removeBusyFlag();
@ -1021,7 +1023,7 @@ Package *Repository::addPackageFromDescription(QString name, const QList<QByteAr
pkgRawPtr->putDescription(name, fields, origin); pkgRawPtr->putDescription(name, fields, origin);
{ {
QWriteLocker locker(&m_lock); QWriteLocker locker(&m_lock);
m_packages[name] = move(pkg); //m_packages[name] = move(pkg);
} }
return pkgRawPtr; return pkgRawPtr;
} }
@ -1043,4 +1045,9 @@ void Repository::removeBusyFlag()
emit available(); emit available();
} }
void Repository::discardPackageLoader()
{
m_loader.reset();
}
} // namespace PackageManagement } // namespace PackageManagement

View File

@ -301,6 +301,9 @@ protected slots:
void addBusyFlag(); void addBusyFlag();
void removeBusyFlag(); void removeBusyFlag();
private slots:
void discardPackageLoader();
protected: protected:
explicit Repository(const QString &name, uint32 index = invalidIndex, QObject *parent = nullptr); explicit Repository(const QString &name, uint32 index = invalidIndex, QObject *parent = nullptr);
@ -317,6 +320,7 @@ protected:
QString m_srcDir; QString m_srcDir;
QString m_pkgDir; QString m_pkgDir;
QAtomicInteger<byte> m_isBusy; QAtomicInteger<byte> m_isBusy;
std::unique_ptr<PackageLoader> m_loader;
private: private:
QReadWriteLock m_lock; QReadWriteLock m_lock;