┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2014-01-21 19:07:58 +0100
committerFrank Reininghaus <[email protected]>2014-01-21 19:08:07 +0100
commit55678afcc17fe987cb67588e34cff807dd64ad5d (patch)
treeb2618b0d14209863257521ed61687d26426e5157 /src
parent419c7578f0ffec27737deafd2abd9d1356095216 (diff)
Use only one "directory contents counting" thread per process
The pointer to QThread object is stored in a global variable, and each view increments/decrements a reference count when it starts/stops using the thread. If this thread reaches zero, the thread is stopped. Note that we cannot just use a smart pointer, like QSharedPointer, to manage the thread, because we must make sure that the thread is not running any more before the QThread is deleted. REVIEW: 115064
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/private/kdirectorycontentscounter.cpp23
-rw-r--r--src/kitemviews/private/kdirectorycontentscounter.h4
2 files changed, 20 insertions, 7 deletions
diff --git a/src/kitemviews/private/kdirectorycontentscounter.cpp b/src/kitemviews/private/kdirectorycontentscounter.cpp
index fd8479feb..65afb7c3e 100644
--- a/src/kitemviews/private/kdirectorycontentscounter.cpp
+++ b/src/kitemviews/private/kdirectorycontentscounter.cpp
@@ -30,7 +30,6 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj
QObject(parent),
m_model(model),
m_queue(),
- m_workerThread(0),
m_worker(0),
m_workerIsBusy(false),
m_dirWatcher(0),
@@ -39,25 +38,34 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj
connect(m_model, SIGNAL(itemsRemoved(KItemRangeList)),
this, SLOT(slotItemsRemoved()));
- m_workerThread = new QThread(this);
+ if (!m_workerThread) {
+ m_workerThread = new QThread();
+ m_workerThread->start();
+ }
+
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();
-
m_dirWatcher = new KDirWatch(this);
connect(m_dirWatcher, SIGNAL(dirty(QString)), this, SLOT(slotDirWatchDirty(QString)));
}
KDirectoryContentsCounter::~KDirectoryContentsCounter()
{
- m_workerThread->quit();
- m_workerThread->wait();
+ --m_workersCount;
+
+ if (m_workersCount == 0) {
+ m_workerThread->quit();
+ m_workerThread->wait();
+ delete m_workerThread;
+ m_workerThread = 0;
+ }
delete m_worker;
}
@@ -162,3 +170,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
diff --git a/src/kitemviews/private/kdirectorycontentscounter.h b/src/kitemviews/private/kdirectorycontentscounter.h
index 425c3632a..c03d0249c 100644
--- a/src/kitemviews/private/kdirectorycontentscounter.h
+++ b/src/kitemviews/private/kdirectorycontentscounter.h
@@ -78,7 +78,9 @@ private:
QQueue<QString> m_queue;
- QThread* m_workerThread;
+ static QThread* m_workerThread;
+ static int m_workersCount;
+
KDirectoryContentsCounterWorker* m_worker;
bool m_workerIsBusy;