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:
parent
f14db5dd3a
commit
b41c9a8996
@ -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
|
|
@ -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
|
|
@ -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 \
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user