┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmmanuel Pescosta <[email protected]>2012-10-28 17:58:06 +0100
committerEmmanuel Pescosta <[email protected]>2012-10-28 17:58:06 +0100
commitb4800d794ce2f900f64decdf4974cd3edffe9b67 (patch)
treec4640e84294e2e21f2da392efe164ee991de1bbc /src
parentc1bc83dfdb27b61dbd558ef21e81659f563dae81 (diff)
Implemented multithreading in KFileItemModelSortAlgorithm. Use as many threads as possible.
Thanks to Frank Reininghaus for all his suggestions. REVIEW: 107025
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/private/kfileitemmodelsortalgorithm.cpp33
-rw-r--r--src/kitemviews/private/kfileitemmodelsortalgorithm.h9
2 files changed, 42 insertions, 0 deletions
diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp
index e0aac13de..63eaea557 100644
--- a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp
+++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp
@@ -19,10 +19,21 @@
#include "kfileitemmodelsortalgorithm.h"
+#include <QThread>
+#include <QtCore>
+
void KFileItemModelSortAlgorithm::sort(KFileItemModel* model,
QList<KFileItemModel::ItemData*>::iterator begin,
QList<KFileItemModel::ItemData*>::iterator end)
{
+ static const int numberOfThreads = QThread::idealThreadCount();
+ parallelSort(model, begin, end, numberOfThreads);
+}
+
+void KFileItemModelSortAlgorithm::sequentialSort(KFileItemModel* model,
+ QList< KFileItemModel::ItemData* >::iterator begin,
+ QList< KFileItemModel::ItemData* >::iterator end)
+{
// The implementation is based on qStableSortHelper() from qalgorithms.h
// Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
@@ -37,6 +48,28 @@ void KFileItemModelSortAlgorithm::sort(KFileItemModel* model,
merge(model, begin, middle, end);
}
+void KFileItemModelSortAlgorithm::parallelSort(KFileItemModel* model,
+ QList< KFileItemModel::ItemData* >::iterator begin,
+ QList< KFileItemModel::ItemData* >::iterator end,
+ const int numberOfThreads)
+{
+ const int span = end - begin;
+
+ if (numberOfThreads > 1 && span > 100) {
+ const int newNumberOfThreads = numberOfThreads / 2;
+ const QList<KFileItemModel::ItemData*>::iterator middle = begin + span / 2;
+
+ QFuture<void> future = QtConcurrent::run(parallelSort, model, begin, middle, newNumberOfThreads);
+ parallelSort(model, middle, end, newNumberOfThreads);
+
+ future.waitForFinished();
+
+ merge(model, begin, middle, end);
+ } else {
+ sequentialSort(model, begin, end);
+ }
+}
+
void KFileItemModelSortAlgorithm::merge(KFileItemModel* model,
QList<KFileItemModel::ItemData*>::iterator begin,
QList<KFileItemModel::ItemData*>::iterator pivot,
diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.h b/src/kitemviews/private/kfileitemmodelsortalgorithm.h
index 3a596dff5..07e5d4a81 100644
--- a/src/kitemviews/private/kfileitemmodelsortalgorithm.h
+++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.h
@@ -44,6 +44,15 @@ public:
QList<KFileItemModel::ItemData*>::iterator end);
private:
+ static void sequentialSort(KFileItemModel* model,
+ QList<KFileItemModel::ItemData*>::iterator begin,
+ QList<KFileItemModel::ItemData*>::iterator end);
+
+ static void parallelSort(KFileItemModel* model,
+ QList<KFileItemModel::ItemData*>::iterator begin,
+ QList<KFileItemModel::ItemData*>::iterator end,
+ const int numberOfThreads);
+
static void merge(KFileItemModel* model,
QList<KFileItemModel::ItemData*>::iterator begin,
QList<KFileItemModel::ItemData*>::iterator pivot,