]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/private/kdirectorycontentscounter.cpp
Merge branch 'master' into frameworks
[dolphin.git] / src / kitemviews / private / kdirectorycontentscounter.cpp
index fd8479febc33f7a1f266d14481ae79df91b76735..cd448e233af6f3ee5a70214c3b79f4b95683c95b 100644 (file)
@@ -30,36 +30,53 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj
     QObject(parent),
     m_model(model),
     m_queue(),
-    m_workerThread(0),
     m_worker(0),
     m_workerIsBusy(false),
     m_dirWatcher(0),
     m_watchedDirs()
 {
-    connect(m_model, SIGNAL(itemsRemoved(KItemRangeList)),
-            this,    SLOT(slotItemsRemoved()));
+    connect(m_model, &KFileItemModel::itemsRemoved,
+            this,    &KDirectoryContentsCounter::slotItemsRemoved);
+
+    if (!m_workerThread) {
+        m_workerThread = new QThread();
+        m_workerThread->start();
+    }
 
-    m_workerThread = new QThread(this);
     m_worker = new KDirectoryContentsCounterWorker();
     m_worker->moveToThread(m_workerThread);
+    ++m_workersCount;
 
-    connect(this,     SIGNAL(requestDirectoryContentsCount(QString,KDirectoryContentsCounterWorker::Options)),
-            m_worker, SLOT(countDirectoryContents(QString,KDirectoryContentsCounterWorker::Options)));
-    connect(m_worker, SIGNAL(result(QString,int)),
-            this,     SLOT(slotResult(QString,int)));
-
-    m_workerThread->start();
+    connect(this,     &KDirectoryContentsCounter::requestDirectoryContentsCount,
+            m_worker, &KDirectoryContentsCounterWorker::countDirectoryContents);
+    connect(m_worker, &KDirectoryContentsCounterWorker::result,
+            this,     &KDirectoryContentsCounter::slotResult);
 
     m_dirWatcher = new KDirWatch(this);
-    connect(m_dirWatcher, SIGNAL(dirty(QString)), this, SLOT(slotDirWatchDirty(QString)));
+    connect(m_dirWatcher, &KDirWatch::dirty, this, &KDirectoryContentsCounter::slotDirWatchDirty);
 }
 
 KDirectoryContentsCounter::~KDirectoryContentsCounter()
 {
-    m_workerThread->quit();
-    m_workerThread->wait();
+    --m_workersCount;
 
-    delete m_worker;
+    if (m_workersCount > 0) {
+        // The worker thread will continue running. It could even be running
+        // a method of m_worker at the moment, so we delete it using
+        // deleteLater() to prevent a crash.
+        m_worker->deleteLater();
+    } else {
+        // There are no remaining workers -> stop the worker thread.
+        m_workerThread->quit();
+        m_workerThread->wait();
+        delete m_workerThread;
+        m_workerThread = 0;
+
+        // The worker thread has finished running now, so it's safe to delete
+        // m_worker. deleteLater() would not work at all because the event loop
+        // which would deliver the event to m_worker is not running any more.
+        delete m_worker;
+    }
 }
 
 void KDirectoryContentsCounter::addDirectory(const QString& path)
@@ -162,3 +179,6 @@ void KDirectoryContentsCounter::startWorker(const QString& path)
         m_workerIsBusy = true;
     }
 }
+
+QThread* KDirectoryContentsCounter::m_workerThread = 0;
+int KDirectoryContentsCounter::m_workersCount = 0;
\ No newline at end of file