X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6c3d9acbc22ea9463ba40ef84c9e8c8419dfacf3..e348bc58267b3dc06f2fc044f9e5ce5a5dfcd087:/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp index e0aac13de..9588d19bf 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). @@ -32,11 +43,33 @@ void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, } const QList::iterator middle = begin + span / 2; - sort(model, begin, middle); - sort(model, middle, end); + sequentialSort(model, begin, middle); + sequentialSort(model, middle, end); 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,