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/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 \
|
||||
|
@ -45,12 +45,19 @@
|
||||
#include "qsslcertificateextension_p.h"
|
||||
|
||||
#include <QtCore/qendian.h>
|
||||
#include <QtCore/qmutex.h>
|
||||
|
||||
#if QT_CONFIG(thread)
|
||||
#include <QtCore/private/qmutexpool_p.h>
|
||||
#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<QByteArray, QString> _q_mapFromX509Name(X509_NAME *name);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user