[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.2/kdelibs/plasma
From:       Jacopo De Simoi <wilderkde () gmail ! com>
Date:       2009-03-23 16:58:05
Message-ID: 1237827485.090735.29322.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 943315 by jacopods:

Backporting 938728 - 938752 - 938756 - 938778 by aseigo


 M  +70 -4     runnermanager.cpp  


--- branches/KDE/4.2/kdelibs/plasma/runnermanager.cpp #943314:943315
@@ -174,6 +174,61 @@
     return m_runner;
 }
 
+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;
+};
+
+DelayedJobCleaner::DelayedJobCleaner(QSet<FindMatchesJob*> jobs, ThreadWeaver::WeaverInterface *weaver)
+    : QObject(weaver),
+      m_weaver(weaver),
+      m_jobs(jobs)
+{
+    connect(m_weaver, SIGNAL(finished()), this, SLOT(checkIfFinished()));
+
+    foreach (FindMatchesJob *job, m_jobs) {
+    connect(job, SIGNAL(done(ThreadWeaver::Job*)), this, SLOT(jobDone(ThreadWeaver::Job*)));
+    }
+}
+
+void DelayedJobCleaner::jobDone(ThreadWeaver::Job *job)
+{
+    FindMatchesJob *runJob = dynamic_cast<FindMatchesJob *>(job);
+
+    if (!runJob) {
+        return;
+    }
+
+    m_jobs.remove(runJob);
+    delete runJob;
+
+    if (m_jobs.isEmpty()) {
+        deleteLater();
+    }
+}
+
+void DelayedJobCleaner::checkIfFinished()
+{
+    if (m_weaver->isIdle()) {
+        qDeleteAll(m_jobs);
+        m_jobs.clear();
+        deleteLater();
+    }
+}
+
+
+
+
 /*****************************************************
 *  RunnerManager::Private class
 *
@@ -212,8 +267,9 @@
         const int maxThreads = config.readEntry("maxThreads", 16);
         const int numThreads = qMin(maxThreads, 2 + ((numProcs - 1) * 2));
         //kDebug() << "setting up" << numThreads << "threads for" << numProcs << "processors";
-        Weaver::instance()->setMaximumNumberOfThreads(numThreads);
-
+        if (numThreads > Weaver::instance()->maximumNumberOfThreads()) {
+            Weaver::instance()->setMaximumNumberOfThreads(numThreads);
+        }
         //Preferred order of execution of runners
         //prioritylist = config.readEntry("priority", QStringList());
 
@@ -284,7 +340,12 @@
 
     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()) {
             //kDebug() << "job actually done, running now **************";
             QueryMatch tmpRun = deferredRun;
@@ -342,6 +403,11 @@
 
 RunnerManager::~RunnerManager()
 {
+    if (!qApp->closingDown() && (!d->searchJobs.isEmpty() || !d->oldSearchJobs.isEmpty())) {
+         new DelayedJobCleaner(d->searchJobs + d->oldSearchJobs, Weaver::instance());
+    }
+
+
     delete d;
 }
 
@@ -450,7 +516,7 @@
     foreach (Plasma::AbstractRunner *r, runable) {
         if ((r->ignoredTypes() & d->context.type()) == 0) {
 //            kDebug() << "launching" << r->name();
-            FindMatchesJob *job = new FindMatchesJob(r, &d->context, this);
+            FindMatchesJob *job = new FindMatchesJob(r, &d->context, Weaver::instance());
             connect(job, SIGNAL(done(ThreadWeaver::Job*)), this, SLOT(jobDone(ThreadWeaver::Job*)));
             Weaver::instance()->enqueue(job);
             d->searchJobs.insert(job);
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic