From b4800d794ce2f900f64decdf4974cd3edffe9b67 Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Sun, 28 Oct 2012 17:58:06 +0100 Subject: Implemented multithreading in KFileItemModelSortAlgorithm. Use as many threads as possible. Thanks to Frank Reininghaus for all his suggestions. REVIEW: 107025 --- .../private/kfileitemmodelsortalgorithm.cpp | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/kitemviews/private/kfileitemmodelsortalgorithm.cpp') 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,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, -- cgit v1.3