From 8a11641bb9709b2c6cb5051163eb5086838c8fac Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 28 Apr 2020 14:19:42 +0200 Subject: Enable setting custom QThreadPool for QtConcurrent methods Task-number: QTBUG-53465 Change-Id: Icff05d5f65dce453ff702502b85c35e20fca86a9 Reviewed-by: Sona Kurazyan --- src/concurrent/qtconcurrentfilter.h | 476 ++++++++++++++++++++++++++++-------- 1 file changed, 375 insertions(+), 101 deletions(-) (limited to 'src/concurrent/qtconcurrentfilter.h') diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h index df4c9ed384..5feedec751 100644 --- a/src/concurrent/qtconcurrentfilter.h +++ b/src/concurrent/qtconcurrentfilter.h @@ -53,286 +53,560 @@ namespace QtConcurrent { //! [QtConcurrent-1] template -ThreadEngineStarter filterInternal(Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce) +ThreadEngineStarter filterInternal(QThreadPool *pool, Sequence &sequence, + KeepFunctor keep, ReduceFunctor reduce) { typedef FilterKernel KernelType; - return startThreadEngine(new KernelType(sequence, keep, reduce)); + return startThreadEngine(new KernelType(pool, sequence, keep, reduce)); } // filter() on sequences +template +QFuture filter(QThreadPool *pool, Sequence &sequence, KeepFunctor keep) +{ + return filterInternal(pool, sequence, keep, QtPrivate::PushBackWrapper()); +} + template QFuture filter(Sequence &sequence, KeepFunctor keep) { - return filterInternal(sequence, keep, QtPrivate::PushBackWrapper()); + return filterInternal(QThreadPool::globalInstance(), + sequence, keep, QtPrivate::PushBackWrapper()); } // filteredReduced() on sequences +template +QFuture filteredReduced(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, sequence, keep, reduce, options); +} + template QFuture filteredReduced(const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { - return startFilteredReduced(sequence, keep, reduce, options); + return startFilteredReduced(QThreadPool::globalInstance(), + sequence, keep, reduce, options); } template , int> = 0> -QFuture filteredReduced(const Sequence &sequence, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +QFuture filteredReduced(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - sequence, keep, - reduce, - ResultType(std::forward(initialValue)), options); + return startFilteredReduced(pool, sequence, keep, reduce, + ResultType(std::forward(initialValue)), options); +} + +template , int> = 0> +QFuture filteredReduced(const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(QThreadPool::globalInstance(), sequence, keep, reduce, + ResultType(std::forward(initialValue)), options); } #ifndef Q_CLANG_QDOC template -QFuture::ResultType> filteredReduced(const Sequence &sequence, +QFuture::ResultType> filteredReduced( + QThreadPool *pool, + const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { return startFilteredReduced::ResultType> - (sequence, - keep, - reduce, - options); + (pool, sequence, keep, reduce, options); +} + +template +QFuture::ResultType> filteredReduced( + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced::ResultType> + (QThreadPool::globalInstance(), sequence, keep, reduce, options); +} + +template ::ResultType, + typename InitialValueType, + std::enable_if_t, int> = 0> +QFuture filteredReduced(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, sequence, keep, reduce, + ResultType(std::forward(initialValue)), options); } template ::ResultType, typename InitialValueType, std::enable_if_t, int> = 0> -QFuture filteredReduced(const Sequence &sequence, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +QFuture filteredReduced(const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - sequence, keep, - reduce, - ResultType(std::forward(initialValue)), options); + return startFilteredReduced(QThreadPool::globalInstance(), sequence, keep, reduce, + ResultType(std::forward(initialValue)), options); } #endif // filteredReduced() on iterators +template +QFuture filteredReduced(QThreadPool *pool, + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, begin, end, keep, reduce, options); +} + template QFuture filteredReduced(Iterator begin, Iterator end, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { - return startFilteredReduced(begin, end, keep, reduce, options); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, reduce, + options); } template , int> = 0> -QFuture filteredReduced(Iterator begin, Iterator end, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +QFuture filteredReduced(QThreadPool *pool, + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options); +} + +template , int> = 0> +QFuture filteredReduced(Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - begin, end, keep, - reduce, - ResultType(std::forward(initialValue)), options); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options); } #ifndef Q_CLANG_QDOC template -QFuture::ResultType> filteredReduced(Iterator begin, +QFuture::ResultType> filteredReduced( + QThreadPool *pool, + Iterator begin, Iterator end, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { return startFilteredReduced::ResultType> - (begin, end, - keep, - reduce, - options); + (pool, begin, end, keep, reduce, options); +} + +template +QFuture::ResultType> filteredReduced( + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced::ResultType> + (QThreadPool::globalInstance(), begin, end, keep, reduce, options); +} + +template ::ResultType, + typename InitialValueType, + std::enable_if_t, int> = 0> +QFuture filteredReduced(QThreadPool *pool, + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options); } template ::ResultType, typename InitialValueType, std::enable_if_t, int> = 0> -QFuture filteredReduced(Iterator begin, Iterator end, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +QFuture filteredReduced(Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - begin, end, keep, - reduce, - ResultType(std::forward(initialValue)), options); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options); } #endif // filtered() on sequences +template +QFuture filtered(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep) +{ + return startFiltered(pool, sequence, keep); +} + template QFuture filtered(const Sequence &sequence, KeepFunctor keep) { - return startFiltered(sequence, keep); + return startFiltered(QThreadPool::globalInstance(), sequence, keep); } // filtered() on iterators template -QFuture::value_type> filtered(Iterator begin, Iterator end, KeepFunctor keep) +QFuture::value_type> filtered(QThreadPool *pool, + Iterator begin, + Iterator end, + KeepFunctor keep) +{ + return startFiltered(pool, begin, end, keep); +} + +template +QFuture::value_type> filtered(Iterator begin, + Iterator end, + KeepFunctor keep) { - return startFiltered(begin, end, keep); + return startFiltered(QThreadPool::globalInstance(), begin, end, keep); } // blocking filter() on sequences +template +void blockingFilter(QThreadPool *pool, Sequence &sequence, KeepFunctor keep) +{ + filterInternal(pool, sequence, keep, QtPrivate::PushBackWrapper()).startBlocking(); +} + template void blockingFilter(Sequence &sequence, KeepFunctor keep) { - filterInternal(sequence, keep, QtPrivate::PushBackWrapper()).startBlocking(); + filterInternal(QThreadPool::globalInstance(), sequence, keep, QtPrivate::PushBackWrapper()) + .startBlocking(); } // blocking filteredReduced() on sequences template -ResultType blockingFilteredReduced(const Sequence &sequence, +ResultType blockingFilteredReduced(QThreadPool *pool, + const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { - return startFilteredReduced(sequence, keep, reduce, options) + return startFilteredReduced(pool, sequence, keep, reduce, options) .startBlocking(); } +template +ResultType blockingFilteredReduced(const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(QThreadPool::globalInstance(), + sequence, keep, reduce, options).startBlocking(); +} + template , int> = 0> -ResultType blockingFilteredReduced(const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, +ResultType blockingFilteredReduced(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - sequence, keep, - reduce, - ResultType(std::forward(initialValue)), options) - .startBlocking(); + return startFilteredReduced(pool, sequence, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); +} + +template , int> = 0> +ResultType blockingFilteredReduced(const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(QThreadPool::globalInstance(), sequence, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); } #ifndef Q_CLANG_QDOC template -typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced(const Sequence &sequence, +typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced( + QThreadPool *pool, + const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { return startFilteredReduced::ResultType> - (sequence, - keep, - reduce, - options).startBlocking(); + (pool, sequence, keep, reduce, options).startBlocking(); +} + +template +typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced( + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced::ResultType> + (QThreadPool::globalInstance(), sequence, keep, reduce, options).startBlocking(); } template ::ResultType, typename InitialValueType, std::enable_if_t, int> = 0> -ResultType blockingFilteredReduced(const Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce, +ResultType blockingFilteredReduced(QThreadPool *pool, + const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - sequence, keep, - reduce, - ResultType(std::forward(initialValue)), options) - .startBlocking(); + return startFilteredReduced(pool, sequence, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); +} + +template ::ResultType, + typename InitialValueType, + std::enable_if_t, int> = 0> +ResultType blockingFilteredReduced(const Sequence &sequence, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(QThreadPool::globalInstance(), sequence, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); } #endif // blocking filteredReduced() on iterators template -ResultType blockingFilteredReduced(Iterator begin, +ResultType blockingFilteredReduced(QThreadPool *pool, + Iterator begin, Iterator end, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { - return startFilteredReduced - (begin, end, - keep, - reduce, - options) + return startFilteredReduced(pool, begin, end, keep, reduce, options) .startBlocking(); } +template +ResultType blockingFilteredReduced(Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, + reduce, options).startBlocking(); +} + + +template , int> = 0> +ResultType blockingFilteredReduced(QThreadPool *pool, + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); +} + template , int> = 0> -ResultType blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +ResultType blockingFilteredReduced(Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - begin, end, keep, - reduce, - ResultType(std::forward(initialValue)), options) - .startBlocking(); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); } #ifndef Q_CLANG_QDOC template -typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced(Iterator begin, +typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced( + QThreadPool *pool, + Iterator begin, Iterator end, KeepFunctor keep, ReduceFunctor reduce, - ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) { return startFilteredReduced::ResultType> - (begin, end, - keep, - reduce, - options) - .startBlocking(); + (pool, begin, end, keep, reduce, options).startBlocking(); +} + +template +typename QtPrivate::ReduceResultType::ResultType blockingFilteredReduced( + Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced::ResultType> + (QThreadPool::globalInstance(), begin, end, keep, reduce, options).startBlocking(); +} + +template ::ResultType, + typename InitialValueType, + std::enable_if_t, int> = 0> +ResultType blockingFilteredReduced(QThreadPool *pool, + Iterator begin, + Iterator end, KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, + ReduceOptions options = ReduceOptions(UnorderedReduce + | SequentialReduce)) +{ + return startFilteredReduced(pool, begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); } template ::ResultType, typename InitialValueType, std::enable_if_t, int> = 0> -ResultType blockingFilteredReduced(Iterator begin, Iterator end, KeepFunctor keep, - ReduceFunctor reduce, InitialValueType &&initialValue, +ResultType blockingFilteredReduced(Iterator begin, + Iterator end, + KeepFunctor keep, + ReduceFunctor reduce, + InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startFilteredReduced( - begin, end, keep, - reduce, - ResultType(std::forward(initialValue)), options) - .startBlocking(); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, reduce, + ResultType(std::forward(initialValue)), options).startBlocking(); } #endif // blocking filtered() on sequences +template +Sequence blockingFiltered(QThreadPool *pool, const Sequence &sequence, KeepFunctor keep) +{ + return startFilteredReduced(pool, sequence, keep, QtPrivate::PushBackWrapper(), + OrderedReduce).startBlocking(); +} + template Sequence blockingFiltered(const Sequence &sequence, KeepFunctor keep) { - return startFilteredReduced(sequence, keep, QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking(); + return startFilteredReduced(QThreadPool::globalInstance(), sequence, keep, + QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking(); } // blocking filtered() on iterators +template +OutputSequence blockingFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor keep) +{ + return startFilteredReduced(pool, begin, end, keep, + QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking(); +} + template OutputSequence blockingFiltered(Iterator begin, Iterator end, KeepFunctor keep) { - return startFilteredReduced(begin, end, - keep, - QtPrivate::PushBackWrapper(), - OrderedReduce).startBlocking(); + return startFilteredReduced(QThreadPool::globalInstance(), begin, end, keep, + QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking(); } } // namespace QtConcurrent -- cgit v1.2.3