if the RunnerManager is deleted but jobs are still processing, create a helper object to wait it out and clean them up when possible
svn path=/trunk/KDE/kdelibs/; revision=938728
This commit is contained in:
parent
02f16ea848
commit
3ecfa9f6d5
@ -167,6 +167,24 @@ Plasma::AbstractRunner* FindMatchesJob::runner() const
|
|||||||
return m_runner;
|
return m_runner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DelayedJobCleaner::DelayedJobCleaner(QSet<FindMatchesJob*> jobs, ThreadWeaver::WeaverInterface *weaver)
|
||||||
|
: QObject(weaver),
|
||||||
|
m_weaver(weaver),
|
||||||
|
m_jobs(jobs)
|
||||||
|
{
|
||||||
|
connect(m_weaver, SIGNAL(finished()), this, SLOT(checkIfFinished()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DelayedJobCleaner::checkIfFinished()
|
||||||
|
{
|
||||||
|
if (m_weaver->isIdle()) {
|
||||||
|
qDeleteAll(m_jobs);
|
||||||
|
m_jobs.clear();
|
||||||
|
deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // Plasma namespace
|
} // Plasma namespace
|
||||||
|
|
||||||
// #include "runnerjobs.moc"
|
// #include "runnerjobs.moc"
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
#include <Weaver/Job.h>
|
#include <Weaver/Job.h>
|
||||||
#include <Weaver/QueuePolicy.h>
|
#include <Weaver/QueuePolicy.h>
|
||||||
@ -120,6 +121,21 @@ private:
|
|||||||
QTimer *m_timer;
|
QTimer *m_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DelayedJobCleaner : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DelayedJobCleaner(QSet<FindMatchesJob*> jobs, ThreadWeaver::WeaverInterface *weaver);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void jobDone(ThreadWeaver::Job*);
|
||||||
|
void checkIfFinished();
|
||||||
|
//connect(ThreadWeaver::instance(), SIGNAL(finished()), this, SLOT(checkIfFinished()));
|
||||||
|
|
||||||
|
private:
|
||||||
|
ThreadWeaver::WeaverInterface *m_weaver;
|
||||||
|
QSet<FindMatchesJob*> m_jobs;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -160,7 +160,12 @@ public:
|
|||||||
|
|
||||||
void jobDone(ThreadWeaver::Job *job)
|
void jobDone(ThreadWeaver::Job *job)
|
||||||
{
|
{
|
||||||
FindMatchesJob *runJob = static_cast<FindMatchesJob*>(job);
|
FindMatchesJob *runJob = dynamic_cast<FindMatchesJob*>(job);
|
||||||
|
|
||||||
|
if (!runJob) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (deferredRun.isEnabled() && runJob->runner() == deferredRun.runner()) {
|
if (deferredRun.isEnabled() && runJob->runner() == deferredRun.runner()) {
|
||||||
//kDebug() << "job actually done, running now **************";
|
//kDebug() << "job actually done, running now **************";
|
||||||
QueryMatch tmpRun = deferredRun;
|
QueryMatch tmpRun = deferredRun;
|
||||||
@ -189,6 +194,17 @@ public:
|
|||||||
QObject::connect(dummy, SIGNAL(done(ThreadWeaver::Job*)), dummy, SLOT(deleteLater()));
|
QObject::connect(dummy, SIGNAL(done(ThreadWeaver::Job*)), dummy, SLOT(deleteLater()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void checkIfFinished()
|
||||||
|
{
|
||||||
|
if (Weaver::instance()->isIdle()) {
|
||||||
|
qDeleteAll(searchJobs);
|
||||||
|
searchJobs.clear();
|
||||||
|
qDeleteAll(oldSearchJobs);
|
||||||
|
oldSearchJobs.clear();
|
||||||
|
q->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Delay in ms before slow runners are allowed to run
|
// Delay in ms before slow runners are allowed to run
|
||||||
static const int slowRunDelay = 400;
|
static const int slowRunDelay = 400;
|
||||||
|
|
||||||
@ -230,6 +246,10 @@ RunnerManager::RunnerManager(KConfigGroup &c, QObject *parent)
|
|||||||
|
|
||||||
RunnerManager::~RunnerManager()
|
RunnerManager::~RunnerManager()
|
||||||
{
|
{
|
||||||
|
if (!qApp->closingDown && (!d->searchJobs.isEmpty() || !d->oldSearchJobs.isEmpty())) {
|
||||||
|
new DelayedJobCleaner(d->searchJobs + d->oldSearchJobs, Weaver::instance());
|
||||||
|
}
|
||||||
|
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user