From b41c9a89969796407b03fd9c5cde1d77999841c1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 5 Jul 2019 10:53:00 +0200 Subject: Inline QMutexPool into its only remaining user Also reduce the pool size from 131 to 17, and use QBasicMutex instead of recursive ones. Change-Id: I3bf0374cce5ff2c07427070aba6128a22c9b70e4 Reviewed-by: Lars Knoll Reviewed-by: Timur Pocheptsov Reviewed-by: Volker Hilsheimer --- src/corelib/thread/qmutexpool.cpp | 151 ---------------------------- src/corelib/thread/qmutexpool_p.h | 88 ---------------- src/corelib/thread/thread.pri | 2 - src/network/ssl/qsslcertificate_openssl.cpp | 13 ++- 4 files changed, 10 insertions(+), 244 deletions(-) delete mode 100644 src/corelib/thread/qmutexpool.cpp delete mode 100644 src/corelib/thread/qmutexpool_p.h (limited to 'src') diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp deleted file mode 100644 index 3ece30c01c..0000000000 --- a/src/corelib/thread/qmutexpool.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qatomic.h" -#include "qmutexpool_p.h" - -QT_BEGIN_NAMESPACE - -Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive)) - -/*! - \class QMutexPool - \inmodule QtCore - \brief The QMutexPool class provides a pool of QMutex objects. - - \internal - - \ingroup thread - - QMutexPool is a convenience class that provides access to a fixed - number of QMutex objects. - - Typical use of a QMutexPool is in situations where it is not - possible or feasible to use one QMutex for every protected object. - The mutex pool will return a mutex based on the address of the - object that needs protection. - - For example, consider this simple class: - - \snippet code/src_corelib_thread_qmutexpool.cpp 0 - - Adding a QMutex member to the Number class does not make sense, - because it is so small. However, in order to ensure that access to - each Number is protected, you need to use a mutex. In this case, a - QMutexPool would be ideal. - - Code to calculate the square of a number would then look something - like this: - - \snippet code/src_corelib_thread_qmutexpool.cpp 1 - - This function will safely calculate the square of a number, since - it uses a mutex from a QMutexPool. The mutex is locked and - unlocked automatically by the QMutexLocker class. See the - QMutexLocker documentation for more details. -*/ - -/*! - Constructs a QMutexPool, reserving space for \a size QMutexes. All - mutexes in the pool are created with \a recursionMode. By default, - all mutexes are non-recursive. - - The QMutexes are created when needed, and deleted when the - QMutexPool is destructed. -*/ -QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size) - : mutexes(size), recursionMode(recursionMode) -{ - for (int index = 0; index < mutexes.count(); ++index) { - mutexes[index].storeRelaxed(0); - } -} - -/*! - Destructs a QMutexPool. All QMutexes that were created by the pool - are deleted. -*/ -QMutexPool::~QMutexPool() -{ - for (int index = 0; index < mutexes.count(); ++index) - delete mutexes[index].loadAcquire(); -} - -/*! - Returns the global QMutexPool instance. -*/ -QMutexPool *QMutexPool::instance() -{ - return globalMutexPool(); -} - -/*! - \fn QMutexPool::get(const void *address) - Returns a QMutex from the pool. QMutexPool uses the value \a address - to determine which mutex is returned from the pool. -*/ - -/*! - \internal - create the mutex for the given index - */ -QMutex *QMutexPool::createMutex(int index) -{ - // mutex not created, create one - QMutex *newMutex = new QMutex(recursionMode); - if (!mutexes[index].testAndSetRelease(nullptr, newMutex)) { - delete newMutex; - return mutexes[index].loadAcquire(); - } else { - return newMutex; - } -} - -/*! - Returns a QMutex from the global mutex pool. -*/ -QMutex *QMutexPool::globalInstanceGet(const void *address) -{ - QMutexPool * const globalInstance = globalMutexPool(); - if (globalInstance == 0) - return 0; - return globalInstance->get(address); -} - -QT_END_NAMESPACE diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h deleted file mode 100644 index 00710199b8..0000000000 --- a/src/corelib/thread/qmutexpool_p.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMUTEXPOOL_P_H -#define QMUTEXPOOL_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "QtCore/qatomic.h" -#include "QtCore/qmutex.h" -#include "QtCore/qvarlengtharray.h" - -QT_REQUIRE_CONFIG(thread); - -QT_BEGIN_NAMESPACE - -class Q_CORE_EXPORT QMutexPool -{ -public: - explicit QMutexPool(QMutex::RecursionMode recursionMode = QMutex::NonRecursive, int size = 131); - ~QMutexPool(); - - inline QMutex *get(const void *address) { - int index = uint(quintptr(address)) % mutexes.count(); - QMutex *m = mutexes[index].loadAcquire(); - if (m) - return m; - else - return createMutex(index); - } - static QMutexPool *instance(); - static QMutex *globalInstanceGet(const void *address); - -private: - QMutex *createMutex(int index); - QVarLengthArray, 131> mutexes; - QMutex::RecursionMode recursionMode; -}; - -QT_END_NAMESPACE - -#endif // QMUTEXPOOL_P_H diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri index 22f0de0523..d11e6500ff 100644 --- a/src/corelib/thread/thread.pri +++ b/src/corelib/thread/thread.pri @@ -28,7 +28,6 @@ qtConfig(thread) { thread/qbasicatomic.h \ thread/qfutex_p.h \ thread/qgenericatomic.h \ - thread/qmutexpool_p.h \ thread/qmutex_p.h \ thread/qorderedmutexlocker_p.h \ thread/qreadwritelock_p.h \ @@ -40,7 +39,6 @@ qtConfig(thread) { SOURCES += \ thread/qatomic.cpp \ thread/qmutex.cpp \ - thread/qmutexpool.cpp \ thread/qreadwritelock.cpp \ thread/qsemaphore.cpp \ thread/qthreadpool.cpp \ diff --git a/src/network/ssl/qsslcertificate_openssl.cpp b/src/network/ssl/qsslcertificate_openssl.cpp index 806c6426e4..6f1fb26add 100644 --- a/src/network/ssl/qsslcertificate_openssl.cpp +++ b/src/network/ssl/qsslcertificate_openssl.cpp @@ -45,12 +45,19 @@ #include "qsslcertificateextension_p.h" #include +#include -#if QT_CONFIG(thread) -#include -#endif QT_BEGIN_NAMESPACE +Q_CONSTEXPR int MutexPoolSize = 17; +static QBasicMutex mutexPool[MutexPoolSize]; +namespace QMutexPool { + static QBasicMutex *globalInstanceGet(const void *addr) + { + return mutexPool + (quintptr(addr) % MutexPoolSize); + } +} + // forward declaration static QMultiMap _q_mapFromX509Name(X509_NAME *name); -- cgit v1.2.3