diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/global/qendian.h | 57 | ||||
-rw-r--r-- | src/corelib/global/qendian.qdoc | 20 | ||||
-rw-r--r-- | src/corelib/global/qglobal.h | 6 | ||||
-rw-r--r-- | src/corelib/io/qdatastream.h | 8 | ||||
-rw-r--r-- | src/corelib/json/qjson.cpp | 2 | ||||
-rw-r--r-- | src/corelib/json/qjsonparser.cpp | 2 | ||||
-rw-r--r-- | src/corelib/mimetypes/qmimemagicrule.cpp | 2 | ||||
-rw-r--r-- | src/corelib/plugin/qelfparser_p.h | 4 | ||||
-rw-r--r-- | src/corelib/thread/qmutexpool.cpp | 11 | ||||
-rw-r--r-- | src/corelib/thread/qmutexpool_p.h | 5 | ||||
-rw-r--r-- | src/corelib/thread/qreadwritelock_p.h | 2 | ||||
-rw-r--r-- | src/corelib/tools/qarraydataops.h | 8 | ||||
-rw-r--r-- | src/corelib/tools/qsimd_p.h | 28 |
13 files changed, 72 insertions, 83 deletions
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 34bb015a2f..c2028289a7 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -58,25 +58,26 @@ QT_BEGIN_NAMESPACE /* * ENDIAN FUNCTIONS */ -inline void qbswap_helper(const uchar *src, uchar *dest, int size) +inline void qbswap_helper(const void *src, void *dest, int size) { - for (int i = 0; i < size ; ++i) dest[i] = src[size - 1 - i]; + for (int i = 0; i < size ; ++i) + static_cast<uchar *>(dest)[i] = static_cast<const uchar *>(src)[size - 1 - i]; } /* - * qbswap(const T src, const uchar *dest); + * qbswap(const T src, const void *dest); * Changes the byte order of \a src from big endian to little endian or vice versa * and stores the result in \a dest. * There is no alignment requirements for \a dest. */ -template <typename T> inline void qbswap(const T src, uchar *dest) +template <typename T> inline void qbswap(const T src, void *dest) { - qbswap_helper(reinterpret_cast<const uchar *>(&src), dest, sizeof(T)); + qbswap_helper(&src, dest, sizeof(T)); } // Used to implement a type-safe and alignment-safe copy operation // If you want to avoid the memcpy, you must write specializations for these functions -template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, uchar *dest) +template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, void *dest) { // Using sizeof(T) inside memcpy function produces internal compiler error with // MSVC2008/ARM in tst_endian -> use extra indirection to resolve size of T. @@ -89,7 +90,7 @@ template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, uchar *dest (dest, &src, size); } -template <typename T> Q_ALWAYS_INLINE T qFromUnaligned(const uchar *src) +template <typename T> Q_ALWAYS_INLINE T qFromUnaligned(const void *src) { T dest; const size_t size = sizeof(T); @@ -122,11 +123,11 @@ template <> inline quint32 qbswap<quint32>(quint32 source) return __builtin_bswap32(source); } -template <> inline void qbswap<quint64>(quint64 source, uchar *dest) +template <> inline void qbswap<quint64>(quint64 source, void *dest) { qToUnaligned<quint64>(__builtin_bswap64(source), dest); } -template <> inline void qbswap<quint32>(quint32 source, uchar *dest) +template <> inline void qbswap<quint32>(quint32 source, void *dest) { qToUnaligned<quint32>(__builtin_bswap32(source), dest); } @@ -158,7 +159,7 @@ template <> inline quint16 qbswap<quint16>(quint16 source) { return __builtin_bswap16(source); } -template <> inline void qbswap<quint16>(quint16 source, uchar *dest) +template <> inline void qbswap<quint16>(quint16 source, void *dest) { qToUnaligned<quint16>(__builtin_bswap16(source), dest); } @@ -187,17 +188,17 @@ template <> inline qint16 qbswap<qint16>(qint16 source) return qbswap<quint16>(quint16(source)); } -template <> inline void qbswap<qint64>(qint64 source, uchar *dest) +template <> inline void qbswap<qint64>(qint64 source, void *dest) { qbswap<quint64>(quint64(source), dest); } -template <> inline void qbswap<qint32>(qint32 source, uchar *dest) +template <> inline void qbswap<qint32>(qint32 source, void *dest) { qbswap<quint32>(quint32(source), dest); } -template <> inline void qbswap<qint16>(qint16 source, uchar *dest) +template <> inline void qbswap<qint16>(qint16 source, void *dest) { qbswap<quint16>(quint16(source), dest); } @@ -212,9 +213,9 @@ template <typename T> inline T qToLittleEndian(T source) { return qbswap<T>(source); } template <typename T> inline T qFromLittleEndian(T source) { return qbswap<T>(source); } -template <typename T> inline void qToBigEndian(T src, uchar *dest) +template <typename T> inline void qToBigEndian(T src, void *dest) { qToUnaligned<T>(src, dest); } -template <typename T> inline void qToLittleEndian(T src, uchar *dest) +template <typename T> inline void qToLittleEndian(T src, void *dest) { qbswap<T>(src, dest); } #else // Q_LITTLE_ENDIAN @@ -226,9 +227,9 @@ template <typename T> inline T qToLittleEndian(T source) { return source; } template <typename T> inline T qFromLittleEndian(T source) { return source; } -template <typename T> inline void qToBigEndian(T src, uchar *dest) +template <typename T> inline void qToBigEndian(T src, void *dest) { qbswap<T>(src, dest); } -template <typename T> inline void qToLittleEndian(T src, uchar *dest) +template <typename T> inline void qToLittleEndian(T src, void *dest) { qToUnaligned<T>(src, dest); } #endif // Q_BYTE_ORDER == Q_BIG_ENDIAN @@ -243,34 +244,34 @@ template <> inline qint8 qbswap<qint8>(qint8 source) return source; } -/* T qFromLittleEndian(const uchar *src) +/* T qFromLittleEndian(const void *src) * This function will read a little-endian encoded value from \a src * and return the value in host-endian encoding. * There is no requirement that \a src must be aligned. */ -template <typename T> inline T qFromLittleEndian(const uchar *src) +template <typename T> inline T qFromLittleEndian(const void *src) { return qFromLittleEndian(qFromUnaligned<T>(src)); } -template <> inline quint8 qFromLittleEndian<quint8>(const uchar *src) -{ return static_cast<quint8>(src[0]); } -template <> inline qint8 qFromLittleEndian<qint8>(const uchar *src) -{ return static_cast<qint8>(src[0]); } +template <> inline quint8 qFromLittleEndian<quint8>(const void *src) +{ return static_cast<const quint8 *>(src)[0]; } +template <> inline qint8 qFromLittleEndian<qint8>(const void *src) +{ return static_cast<const qint8 *>(src)[0]; } /* This function will read a big-endian (also known as network order) encoded value from \a src * and return the value in host-endian encoding. * There is no requirement that \a src must be aligned. */ -template <class T> inline T qFromBigEndian(const uchar *src) +template <class T> inline T qFromBigEndian(const void *src) { return qFromBigEndian(qFromUnaligned<T>(src)); } -template <> inline quint8 qFromBigEndian<quint8>(const uchar *src) -{ return static_cast<quint8>(src[0]); } -template <> inline qint8 qFromBigEndian<qint8>(const uchar *src) -{ return static_cast<qint8>(src[0]); } +template <> inline quint8 qFromBigEndian<quint8>(const void *src) +{ return static_cast<const quint8 *>(src)[0]; } +template <> inline qint8 qFromBigEndian<qint8>(const void *src) +{ return static_cast<const qint8 *>(src)[0]; } QT_END_NAMESPACE diff --git a/src/corelib/global/qendian.qdoc b/src/corelib/global/qendian.qdoc index 3b22dcec87..9ce9dbdb0e 100644 --- a/src/corelib/global/qendian.qdoc +++ b/src/corelib/global/qendian.qdoc @@ -35,7 +35,7 @@ /*! \internal - \fn T qFromUnaligned(const uchar *ptr) + \fn T qFromUnaligned(const void *ptr) \since 5.5 Loads a \c{T} from address \a ptr, which may be misaligned. @@ -46,7 +46,7 @@ /*! \internal - \fn void qToUnaligned(T t, uchar *ptr) + \fn void qToUnaligned(T t, void *ptr) \since 4.5 Stores \a t to address \a ptr, which may be misaligned. @@ -57,7 +57,7 @@ /*! - \fn T qFromBigEndian(const uchar *src) + \fn T qFromBigEndian(const void *src) \since 4.3 \relates <QtEndian> @@ -69,6 +69,8 @@ \note Template type \c{T} can either be a qint16, qint32 or qint64. Other types of integers, e.g., qlong, are not applicable. + \note Since Qt 5.7, the type of the \a src parameter is a void pointer. + There are no data alignment constraints for \a src. \sa qFromLittleEndian() @@ -88,7 +90,7 @@ unmodified. */ /*! - \fn T qFromLittleEndian(const uchar *src) + \fn T qFromLittleEndian(const void *src) \since 4.3 \relates <QtEndian> @@ -100,6 +102,8 @@ \note Template type \c{T} can either be a qint16, qint32 or qint64. Other types of integers, e.g., qlong, are not applicable. + \note Since Qt 5.7, the type of the \a src parameter is a void pointer. + There are no data alignment constraints for \a src. \sa qFromBigEndian() @@ -119,7 +123,7 @@ unmodified. */ /*! - \fn void qToBigEndian(T src, uchar *dest) + \fn void qToBigEndian(T src, void *dest) \since 4.3 \relates <QtEndian> @@ -130,6 +134,8 @@ There are no data alignment constraints for \a dest. + \note Since Qt 5.7, the type of the \a dest parameter is a void pointer. + \sa qFromBigEndian() \sa qFromLittleEndian() \sa qToLittleEndian() @@ -147,7 +153,7 @@ unmodified. */ /*! - \fn void qToLittleEndian(T src, uchar *dest) + \fn void qToLittleEndian(T src, void *dest) \since 4.3 \relates <QtEndian> @@ -158,6 +164,8 @@ There are no data alignment constraints for \a dest. + \note Since Qt 5.7, the type of the \a dest parameter is a void pointer. + \sa qFromBigEndian() \sa qFromLittleEndian() \sa qToBigEndian() diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index cf647ea20d..f9d7a1c43f 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1071,9 +1071,9 @@ struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...> }; #if defined(__cpp_variable_templates) && __cpp_variable_templates >= 201304 // C++14 -template <typename... Args> Q_CONSTEXPR QOverload<Args...> qOverload Q_DECL_UNUSED = {}; -template <typename... Args> Q_CONSTEXPR QConstOverload<Args...> qConstOverload Q_DECL_UNUSED = {}; -template <typename... Args> Q_CONSTEXPR QNonConstOverload<Args...> qNonConstOverload Q_DECL_UNUSED = {}; +template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QOverload<Args...> qOverload = {}; +template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QConstOverload<Args...> qConstOverload = {}; +template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QNonConstOverload<Args...> qNonConstOverload = {}; #endif #endif diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index 76d173bb3e..c7f8840a82 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -364,8 +364,10 @@ Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QHash<Key, T> &has if (in.status() != QDataStream::Ok) hash.clear(); - if (oldStatus != QDataStream::Ok) + if (oldStatus != QDataStream::Ok) { + in.resetStatus(); in.setStatus(oldStatus); + } return in; } @@ -408,8 +410,10 @@ Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<aKey, aT> &ma } if (in.status() != QDataStream::Ok) map.clear(); - if (oldStatus != QDataStream::Ok) + if (oldStatus != QDataStream::Ok) { + in.resetStatus(); in.setStatus(oldStatus); + } return in; } diff --git a/src/corelib/json/qjson.cpp b/src/corelib/json/qjson.cpp index bb98e25fa5..4b98ef076c 100644 --- a/src/corelib/json/qjson.cpp +++ b/src/corelib/json/qjson.cpp @@ -435,7 +435,7 @@ void Value::copyData(const QJsonValue &v, char *dest, bool compressed) switch (v.t) { case QJsonValue::Double: if (!compressed) { - qToLittleEndian(v.ui, (uchar *)dest); + qToLittleEndian(v.ui, dest); } break; case QJsonValue::String: { diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp index 2926adf10a..6a3d1de99a 100644 --- a/src/corelib/json/qjsonparser.cpp +++ b/src/corelib/json/qjsonparser.cpp @@ -738,7 +738,7 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset) } int pos = reserveSpace(sizeof(double)); - qToLittleEndian(ui, reinterpret_cast<uchar *>(data + pos)); + qToLittleEndian(ui, data + pos); if (current - baseOffset >= Value::MaxSize) { lastError = QJsonParseError::DocumentTooLarge; return false; diff --git a/src/corelib/mimetypes/qmimemagicrule.cpp b/src/corelib/mimetypes/qmimemagicrule.cpp index 8461bf7130..7e07f8acb9 100644 --- a/src/corelib/mimetypes/qmimemagicrule.cpp +++ b/src/corelib/mimetypes/qmimemagicrule.cpp @@ -163,7 +163,7 @@ bool QMimeMagicRule::matchNumber(const QByteArray &data) const const char *p = data.constData() + m_startPos; const char *e = data.constData() + qMin(data.size() - int(sizeof(T)), m_endPos + 1); for ( ; p <= e; ++p) { - if ((qFromUnaligned<T>(reinterpret_cast<const uchar *>(p)) & mask) == (value & mask)) + if ((qFromUnaligned<T>(p) & mask) == (value & mask)) return true; } diff --git a/src/corelib/plugin/qelfparser_p.h b/src/corelib/plugin/qelfparser_p.h index 2ecdc4e786..145f00df43 100644 --- a/src/corelib/plugin/qelfparser_p.h +++ b/src/corelib/plugin/qelfparser_p.h @@ -89,9 +89,9 @@ public: T read(const char *s) { if (m_endian == ElfBigEndian) - return qFromBigEndian<T>(reinterpret_cast<const uchar *>(s)); + return qFromBigEndian<T>(s); else - return qFromLittleEndian<T>(reinterpret_cast<const uchar *>(s)); + return qFromLittleEndian<T>(s); } const char *parseSectionHeader(const char* s, ElfSectionHeader *sh); diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp index 522fd5eac2..90b6989467 100644 --- a/src/corelib/thread/qmutexpool.cpp +++ b/src/corelib/thread/qmutexpool.cpp @@ -92,10 +92,11 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive)) QMutexPool is destructed. */ QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size) - : count(size), - mutexes(new QAtomicPointer<QMutex>[size]()), // (): zero-initialize - recursionMode(recursionMode) + : mutexes(size), recursionMode(recursionMode) { + for (int index = 0; index < mutexes.count(); ++index) { + mutexes[index].store(0); + } } /*! @@ -104,8 +105,8 @@ QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size) */ QMutexPool::~QMutexPool() { - qDeleteAll(mutexes, mutexes + count); - delete[] mutexes; + for (int index = 0; index < mutexes.count(); ++index) + delete mutexes[index].load(); } /*! diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h index 33e9a52cb7..796e65d960 100644 --- a/src/corelib/thread/qmutexpool_p.h +++ b/src/corelib/thread/qmutexpool_p.h @@ -66,7 +66,7 @@ public: ~QMutexPool(); inline QMutex *get(const void *address) { - int index = uint(quintptr(address)) % count; + int index = uint(quintptr(address)) % mutexes.count(); QMutex *m = mutexes[index].load(); if (m) return m; @@ -78,8 +78,7 @@ public: private: QMutex *createMutex(int index); - int count; - QAtomicPointer<QMutex> *mutexes; + QVarLengthArray<QAtomicPointer<QMutex>, 131> mutexes; QMutex::RecursionMode recursionMode; }; diff --git a/src/corelib/thread/qreadwritelock_p.h b/src/corelib/thread/qreadwritelock_p.h index 285f017655..24d25eb2be 100644 --- a/src/corelib/thread/qreadwritelock_p.h +++ b/src/corelib/thread/qreadwritelock_p.h @@ -65,7 +65,7 @@ class QReadWriteLockPrivate public: QReadWriteLockPrivate(bool isRecursive = false) : readerCount(0), writerCount(0), waitingReaders(0), waitingWriters(0), - recursive(isRecursive), id(0) {} + recursive(isRecursive), id(0), currentWriter(nullptr) {} QMutex mutex; QWaitCondition writerCond; diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 47df15ddaa..6bb8280ca8 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -319,7 +319,8 @@ struct QMovableArrayOps , end(finish) , displace(diff) { - ::memmove(begin + displace, begin, (end - begin) * sizeof(T)); + ::memmove(static_cast<void *>(begin + displace), static_cast<void *>(begin), + (end - begin) * sizeof(T)); } void commit() { displace = 0; } @@ -327,7 +328,8 @@ struct QMovableArrayOps ~ReversibleDisplace() { if (displace) - ::memmove(begin, begin + displace, (end - begin) * sizeof(T)); + ::memmove(static_cast<void *>(begin), static_cast<void *>(begin + displace), + (end - begin) * sizeof(T)); } T *const begin; @@ -384,7 +386,7 @@ struct QMovableArrayOps ~Mover() { - ::memmove(destination, source, n * sizeof(T)); + ::memmove(static_cast<void *>(destination), static_cast<const void *>(source), n * sizeof(T)); size -= (source - destination); } diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h index 8cf0c5a4d2..259da3cfec 100644 --- a/src/corelib/tools/qsimd_p.h +++ b/src/corelib/tools/qsimd_p.h @@ -285,7 +285,7 @@ #endif #endif // AArch64/ARM64 -#if defined(Q_PROCESSOR_ARM_V8) +#if defined(Q_PROCESSOR_ARM_V8) && defined(__ARM_FEATURE_CRC32) #define QT_FUNCTION_TARGET_STRING_CRC32 "+crc" # include <arm_acle.h> #endif @@ -468,32 +468,6 @@ static inline quint64 qCpuFeatures() #define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \ for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i) -template <typename T> -Q_ALWAYS_INLINE -T qUnalignedLoad(const void *ptr) Q_DECL_NOTHROW -{ - T result; -#if QT_HAS_BUILTIN(__builtin_memcpy) - __builtin_memcpy -#else - memcpy -#endif - /*memcpy*/(&result, ptr, sizeof result); - return result; -} - -template <typename T> -Q_ALWAYS_INLINE -void qUnalignedStore(void *ptr, T t) Q_DECL_NOTHROW -{ -#if QT_HAS_BUILTIN(__builtin_memcpy) - __builtin_memcpy -#else - memcpy -#endif - /*memcpy*/(ptr, &t, sizeof t); -} - QT_END_NAMESPACE #endif // QSIMD_P_H |