diff options
Diffstat (limited to 'src/corelib/codecs/qtextcodec.cpp')
-rw-r--r-- | src/corelib/codecs/qtextcodec.cpp | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index b7bb3196af..06fd88da90 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -47,6 +47,7 @@ #include "qendian.h" #include "qfile.h" #include "qlist.h" +#include <private/qlocking_p.h> #include "qstringlist.h" #include "qvarlengtharray.h" #if !defined(QT_BOOTSTRAPPED) @@ -86,7 +87,7 @@ #endif // icu #endif // QT_BOOTSTRAPPED -#include "qmutex.h" +#include <mutex> #include <stdlib.h> #include <ctype.h> @@ -100,8 +101,16 @@ QT_BEGIN_NAMESPACE typedef QList<QTextCodec*>::ConstIterator TextCodecListConstIt; typedef QList<QByteArray>::ConstIterator ByteArrayListConstIt; -Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive)); -QMutex *qTextCodecsMutex() { return textCodecsMutex(); } +Q_GLOBAL_STATIC(QRecursiveMutex, textCodecsMutex); + +class TextCodecsMutexLocker +{ + using Lock = decltype(qt_unique_lock(std::declval<QRecursiveMutex&>())); + // ### FIXME: this is used when textCodecsMutex already == nullptr + const Lock lock = qt_unique_lock(textCodecsMutex()); +public: + TextCodecsMutexLocker() {} // required d/t an ICC 19 bug +}; #if !QT_CONFIG(icu) static char qtolower(char c) @@ -159,10 +168,10 @@ static QTextCodec *setupLocaleMapper() { QCoreGlobalData *globalData = QCoreGlobalData::instance(); - QTextCodec *locale = 0; + QTextCodec *locale = nullptr; { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; if (globalData->allCodecs.isEmpty()) setup(); } @@ -208,7 +217,7 @@ static QTextCodec *setupLocaleMapper() // First part is getting that locale name. First try setlocale() which // definitely knows it, but since we cannot fully trust it, get ready // to fall back to environment variables. - const QByteArray ctype = setlocale(LC_CTYPE, 0); + const QByteArray ctype = setlocale(LC_CTYPE, nullptr); // Get the first nonempty value from $LC_ALL, $LC_CTYPE, and $LANG // environment variables. @@ -477,7 +486,7 @@ QTextCodec::ConverterState::~ConverterState() */ QTextCodec::QTextCodec() { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalInstance = QCoreGlobalData::instance(); if (globalInstance->allCodecs.isEmpty()) @@ -501,7 +510,7 @@ QTextCodec::~QTextCodec() globalData->codecForLocale.testAndSetRelaxed(this, nullptr); - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; globalData->allCodecs.removeOne(this); @@ -532,23 +541,21 @@ QTextCodec::~QTextCodec() QTextCodec *QTextCodec::codecForName(const QByteArray &name) { if (name.isEmpty()) - return 0; + return nullptr; - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; setup(); #if !QT_CONFIG(icu) QTextCodecCache *cache = &globalData->codecCache; QTextCodec *codec; - if (cache) { - codec = cache->value(name); - if (codec) - return codec; - } + codec = cache->value(name); + if (codec) + return codec; for (TextCodecListConstIt it = globalData->allCodecs.constBegin(), cend = globalData->allCodecs.constEnd(); it != cend; ++it) { QTextCodec *cursor = *it; @@ -560,14 +567,13 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) QList<QByteArray> aliases = cursor->aliases(); for (ByteArrayListConstIt ait = aliases.constBegin(), acend = aliases.constEnd(); ait != acend; ++ait) { if (qTextCodecNameMatch(*ait, name)) { - if (cache) - cache->insert(name, cursor); + cache->insert(name, cursor); return cursor; } } } - return 0; + return nullptr; #else return QIcuCodec::codecForNameUnlocked(name); #endif @@ -581,11 +587,11 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) */ QTextCodec* QTextCodec::codecForMib(int mib) { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; if (globalData->allCodecs.isEmpty()) setup(); @@ -611,7 +617,7 @@ QTextCodec* QTextCodec::codecForMib(int mib) #if QT_CONFIG(icu) return QIcuCodec::codecForMibUnlocked(mib); #else - return 0; + return nullptr; #endif } @@ -627,7 +633,7 @@ QTextCodec* QTextCodec::codecForMib(int mib) */ QList<QByteArray> QTextCodec::availableCodecs() { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (globalData->allCodecs.isEmpty()) @@ -659,7 +665,7 @@ QList<int> QTextCodec::availableMibs() #if QT_CONFIG(icu) return QIcuCodec::availableMibs(); #else - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (globalData->allCodecs.isEmpty()) @@ -704,14 +710,13 @@ QTextCodec* QTextCodec::codecForLocale() { QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; QTextCodec *codec = globalData->codecForLocale.loadAcquire(); if (!codec) { #if QT_CONFIG(icu) - textCodecsMutex()->lock(); + const TextCodecsMutexLocker locker; codec = QIcuCodec::defaultCodecUnlocked(); - textCodecsMutex()->unlock(); #else // setupLocaleMapper locks as necessary codec = setupLocaleMapper(); @@ -830,7 +835,7 @@ QTextEncoder* QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags) const */ QByteArray QTextCodec::fromUnicode(const QString& str) const { - return convertFromUnicode(str.constData(), str.length(), 0); + return convertFromUnicode(str.constData(), str.length(), nullptr); } #endif @@ -863,7 +868,7 @@ QByteArray QTextCodec::fromUnicode(QStringView str) const */ QString QTextCodec::toUnicode(const QByteArray& a) const { - return convertToUnicode(a.constData(), a.length(), 0); + return convertToUnicode(a.constData(), a.length(), nullptr); } /*! @@ -915,7 +920,7 @@ bool QTextCodec::canEncode(QStringView s) const QString QTextCodec::toUnicode(const char *chars) const { int len = qstrlen(chars); - return convertToUnicode(chars, len, 0); + return convertToUnicode(chars, len, nullptr); } @@ -1061,7 +1066,7 @@ QString QTextDecoder::toUnicode(const char *chars, int len) } // in qstring.cpp: -void qt_from_latin1(ushort *dst, const char *str, size_t size) Q_DECL_NOTHROW; +void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept; /*! \overload @@ -1110,7 +1115,7 @@ QString QTextDecoder::toUnicode(const QByteArray &ba) QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) { // determine charset - QTextCodec *c = QTextCodec::codecForUtfText(ba, 0); + QTextCodec *c = QTextCodec::codecForUtfText(ba, nullptr); if (!c) { static Q_RELAXED_CONSTEXPR auto matcher = qMakeStaticByteArrayMatcher("meta "); QByteArray header = ba.left(1024).toLower(); |