From 429218eaf22c1bde24ba6875895c33facfa6ae12 Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Sun, 28 Oct 2012 17:58:06 +0100 Subject: [PATCH] Implemented multithreading in KFileItemModelSortAlgorithm. Use as many threads as possible. Thanks to Frank Reininghaus for all his suggestions. REVIEW: 107025 --- .../private/kfileitemmodelsortalgorithm.cpp | 33 +++++++++++++++++++ .../private/kfileitemmodelsortalgorithm.h | 9 +++++ 2 files changed, 42 insertions(+) diff --git a/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp index e0aac13de3..63eaea5578 100644 --- a/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp +++ b/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp @@ -19,9 +19,20 @@ #include "kfileitemmodelsortalgorithm.h" +#include +#include + void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, QList::iterator begin, QList::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::iterator middle = begin + span / 2; + + QFuture 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::iterator begin, QList::iterator pivot, diff --git a/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.h b/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.h index 3a596dff56..07e5d4a814 100644 --- a/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.h +++ b/dolphin/src/kitemviews/private/kfileitemmodelsortalgorithm.h @@ -44,6 +44,15 @@ public: QList::iterator end); private: + static void sequentialSort(KFileItemModel* model, + QList::iterator begin, + QList::iterator end); + + static void parallelSort(KFileItemModel* model, + QList::iterator begin, + QList::iterator end, + const int numberOfThreads); + static void merge(KFileItemModel* model, QList::iterator begin, QList::iterator pivot,