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 <lars.knoll@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Marc Mutz 2019-07-05 10:53:00 +02:00
parent f14db5dd3a
commit b41c9a8996
4 changed files with 10 additions and 244 deletions

View File

@ -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

View File

@ -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 <QtCore/private/qglobal_p.h>
#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<QAtomicPointer<QMutex>, 131> mutexes;
QMutex::RecursionMode recursionMode;
};
QT_END_NAMESPACE
#endif // QMUTEXPOOL_P_H

View File

@ -28,7 +28,6 @@ qtConfig(thread) {
thread/qbasicatomic.h \ thread/qbasicatomic.h \
thread/qfutex_p.h \ thread/qfutex_p.h \
thread/qgenericatomic.h \ thread/qgenericatomic.h \
thread/qmutexpool_p.h \
thread/qmutex_p.h \ thread/qmutex_p.h \
thread/qorderedmutexlocker_p.h \ thread/qorderedmutexlocker_p.h \
thread/qreadwritelock_p.h \ thread/qreadwritelock_p.h \
@ -40,7 +39,6 @@ qtConfig(thread) {
SOURCES += \ SOURCES += \
thread/qatomic.cpp \ thread/qatomic.cpp \
thread/qmutex.cpp \ thread/qmutex.cpp \
thread/qmutexpool.cpp \
thread/qreadwritelock.cpp \ thread/qreadwritelock.cpp \
thread/qsemaphore.cpp \ thread/qsemaphore.cpp \
thread/qthreadpool.cpp \ thread/qthreadpool.cpp \

View File

@ -45,12 +45,19 @@
#include "qsslcertificateextension_p.h" #include "qsslcertificateextension_p.h"
#include <QtCore/qendian.h> #include <QtCore/qendian.h>
#include <QtCore/qmutex.h>
#if QT_CONFIG(thread)
#include <QtCore/private/qmutexpool_p.h>
#endif
QT_BEGIN_NAMESPACE 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 // forward declaration
static QMultiMap<QByteArray, QString> _q_mapFromX509Name(X509_NAME *name); static QMultiMap<QByteArray, QString> _q_mapFromX509Name(X509_NAME *name);