From c5a51926d618470a90430eb4b2988fc437434797 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Sat, 7 Nov 2020 17:06:18 +0100 Subject: Revert "Refine {QString, QBA}::reallocData() logic" This reverts commit 504972f838761f79a170c22225add496e7e5af6a. Introduced realloc failures in qdoc. Task-number: QTBUG-88258 Change-Id: I953e8d3933085022c75068af357ec9a44ab7e984 Reviewed-by: Lars Knoll --- src/corelib/text/qbytearray.cpp | 9 +++++---- src/corelib/text/qstring.cpp | 9 +++++---- src/corelib/tools/qarraydata.cpp | 9 +++------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index c482e2335e..f4ade684a0 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -1708,11 +1708,12 @@ void QByteArray::reallocData(qsizetype alloc, QArrayData::AllocationOption optio return; } - // don't use reallocate path when reducing capacity and there's free space - // at the beginning: might shift data pointer outside of allocated space - const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0 && alloc < d.constAllocatedCapacity(); + // there's a case of slow reallocate path where we need to memmove the data + // before a call to ::realloc(), meaning that there's an extra "heavy" + // operation. just prefer ::malloc() branch in this case + const bool slowReallocatePath = d.freeSpaceAtBegin() > 0; - if (d->needsDetach() || cannotUseReallocate) { + if (d->needsDetach() || slowReallocatePath) { DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size)); if (dd.size > 0) ::memcpy(dd.data(), d.data(), dd.size); diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index eed98e7c7e..32e5bb7b20 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -2504,11 +2504,12 @@ void QString::reallocData(qsizetype alloc, QArrayData::AllocationOption option) return; } - // don't use reallocate path when reducing capacity and there's free space - // at the beginning: might shift data pointer outside of allocated space - const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0 && alloc < d.constAllocatedCapacity(); + // there's a case of slow reallocate path where we need to memmove the data + // before a call to ::realloc(), meaning that there's an extra "heavy" + // operation. just prefer ::malloc() branch in this case + const bool slowReallocatePath = d.freeSpaceAtBegin() > 0; - if (d->needsDetach() || cannotUseReallocate) { + if (d->needsDetach() || slowReallocatePath) { DataPointer dd(Data::allocate(alloc, option), qMin(alloc, d.size)); if (dd.size > 0) ::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar)); diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp index e73dc35810..2bf3e9bacc 100644 --- a/src/corelib/tools/qarraydata.cpp +++ b/src/corelib/tools/qarraydata.cpp @@ -233,13 +233,10 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer, { Q_ASSERT(!data || !data->isShared()); - const qsizetype headerSize = sizeof(QArrayData); + qsizetype headerSize = sizeof(QArrayData); qsizetype allocSize = calculateBlockSize(capacity, objectSize, headerSize, option); - const qptrdiff offset = dataPointer - ? reinterpret_cast(dataPointer) - reinterpret_cast(data) - : headerSize; + qptrdiff offset = dataPointer ? reinterpret_cast(dataPointer) - reinterpret_cast(data) : headerSize; Q_ASSERT(offset > 0); - Q_ASSERT(offset <= allocSize); // == when all free space is at the beginning allocSize = reserveExtraBytes(allocSize); if (Q_UNLIKELY(allocSize < 0)) // handle overflow. cannot reallocate reliably @@ -247,7 +244,7 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer, QArrayData *header = static_cast(::realloc(data, size_t(allocSize))); if (header) { - header->alloc = capacity; + header->alloc = uint(capacity); dataPointer = reinterpret_cast(header) + offset; } else { dataPointer = nullptr; -- cgit v1.2.3