Commit Graph

48180 Commits

Author SHA1 Message Date
Volker Hilsheimer
5b0a5ac20c Fix some qdoc warnings: function parameter names
In QTextDocument and QTextFormat, standardize language a bit.

Change-Id: I7c81ecc7a32e36ec32214e6b5386a2827cfcbc3f
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-22 20:55:49 +02:00
Volker Hilsheimer
89627fd7f9 Fix some qdoc warnings: QtConcurrent functors and exceptions
Change-Id: I32e45c85cedb74a6dcbd99930910b730f1160fae
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-22 20:55:41 +02:00
Volker Hilsheimer
2692cb0e61 Doc: Fix QSqlField documentation for deprecated constructor
Also, merge constructor overloads, and remove superfluous explicit from
a non-converting constructor.

Change-Id: I60d0e646d1aaeb8ea66b7598076c3e3ba356c12e
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-22 20:55:35 +02:00
Volker Hilsheimer
55f4a4e6f0 Fix various qdoc warnings
Parameter types and names, missing enum values, and \since 6.0.

Change-Id: I1b028fcf2ef0b57accb1ef7cebf17dab9f6d571e
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-22 20:55:22 +02:00
David Faure
fc8f5afc87 QMimeDatabase: fix handling of glob-deleteall
Binary provider:
  It was not possible to remove the first glob in a local override,
  because the mainPattern handling would re-add the first glob back.

XML provider:
  It didn't support glob-deleteall.
  Also, the order of the providers was wrong. We want to pick local
  overrides first, the internal DB has to go last in the list.

Fixes: QTBUG-85436
Pick-to: 5.15
Change-Id: I9a4523f37cd962c730df9a6ed992bd01c075bf03
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-09-22 20:40:45 +02:00
Thiago Macieira
ad9108e2e9 QFile::copy: call syncToDisk on destination
Syncing the source makes no sense.

Fixes: QTBUG-86806
Change-Id: I0d3ff441bec041728945fffd1637205d9cf6ab72
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-22 11:34:31 -07:00
Mårten Nordheim
a07f35409b QDecompressHelper: limit decompression ratio
To avoid potential decompression bombs. This is implemented with just
a simple check that the ratio doesn't pass some hardcoded preset.

Change-Id: I17246f0f43e73280cdb35a8f03d65885f5678ad6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-09-22 19:08:53 +02:00
Edward Welbourne
16a1ddd733 Use QLatin1Char in place of QChar in a few more places
QDateTimeParser mostly uses QLatin1Char where it can, but missed a few
cases.

Change-Id: I3df37c350047214aeb843c3290014fa45b4656fe
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Andreas Buhr <andreas.buhr@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
2020-09-22 19:08:53 +02:00
Edward Welbourne
92a9a18b5d Count digits in QDateTimeParser::parseSection()'s numeric fields
Assuming everything up to the first space is a digit is not sound.

Change-Id: Iab5bb134c8e3299da726625c53b6a9b23f09dbb4
Reviewed-by: Andreas Buhr <andreas.buhr@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-09-22 19:08:53 +02:00
Edward Welbourne
df276fb29f Inline various date-time fromString(const QString &...) methods
As requested in code-review.

Task-number: QTBUG-86400
Change-Id: I14e051e4bad3e8e227c6401e699f979663ffd10f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-22 19:08:53 +02:00
Alexandru Croitor
a3bd80c08c CMake: Regenerate projects
Clean up the state of the projects,
before changing the internal CMake API function names.

Task-number: QTBUG-86815
Change-Id: I90f1b21b8ae4439a4a293872c3bb728dab44a50d
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-09-22 19:08:53 +02:00
Alexandru Croitor
9959090da8 CMake: Fix failing tests on macOS developer builds
tst_qguiapplication was missing an Info.plist file.
We can't directly reference the tst_qcoreapplication Info.plist
file like the qmake project does, because that breaks ninja
(says multiple rules create the same output file), so use a
copy instead.

Blacklist the qpluginloader loadMachO test when doing CMake builds.
The qmake projects use multiple custom rules to build the macho
plugins, which need to be ported to CMake.

Task-number: QTBUG-86053
Task-number: QTBUG-86792
Change-Id: Iaff2b2d5e9e84a457b4f2ffc011a580388498f00
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-09-22 19:08:53 +02:00
Ulf Hermann
4b57246a61 Remove default ctor for QIterable
MSVC has strange problems with it and we don't actually need it.

Change-Id: I2c443946d52d475208800f310b5f910da165c99b
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2020-09-22 13:52:19 +02:00
Friedemann Kleint
631eed68d0 Fix some MSVC conversion warnings
Change-Id: Ib2c1fdb7b84f89201136438362ab5962126ec929
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-09-22 09:51:15 +02:00
Friedemann Kleint
1b0e6b909f Windows QPA: Fix warnings about deprecated operator + for keys
Pick-to: 5.15
Change-Id: I48bd41465e62fef6f5ddcf235716a4be5eff46d4
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-09-22 09:51:10 +02:00
Volker Hilsheimer
1e2325f0dc Fix some qdoc warnings: typos and qdoc syntax
Change-Id: Idf5c1490330e0f2e5d4bcf920eb03fc9993b3c8a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-22 06:01:02 +02:00
Volker Hilsheimer
19da4897af Fix some qdoc warnings: QTableWidgetSelectionRange
The default constructor was no longer documented, and the documentation of
the initializing constructor wasn't tied to the implementation anymore after
33fc622686.

Change-Id: I5354a7e3b249f2128a6421546d4ebb375ae48160
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 20:09:32 +02:00
Volker Hilsheimer
642ba2c278 Fix some qdoc warnings: typos
It's \reimp, not \reimpl, and this particular textAlignment variable
documentation is for QStyleOptionComboBox.

Change-Id: I90f1519410a4378c54777e29acce70b55975e70e
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 20:09:28 +02:00
Volker Hilsheimer
75285b7b8c Fix some qdoc warnings: broken links
We can't split a \l{Class::}member over two lines.

Change-Id: Id4806402ab349fd20fbf65eee9502e2d08e21dc5
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 20:09:24 +02:00
Volker Hilsheimer
5a8e121cfa Fix some qdoc warnings: unnamed parameters
If we reference a parameter in the documentation, then we have to name
it as well in the function declaration. Use Q_UNUSED instead of omitting.

Change-Id: Icb32d3bd965f0361d112f62cb3bbbbb2005d378c
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 20:09:21 +02:00
Edward Welbourne
0caffd37fb Inline trivial function used only by deprecated functions
QIcon had two methods calling a trivial local static; both were
deprecated. Inlined the local static rather than #if-ing it on the
same deprecation #if-ery.

Shift the #if-ery on the deprecated methods to embrace also their docs.

Change-Id: I5f6755ef99dd6b4abddc343c9bedf4815e50d567
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2020-09-21 16:54:13 +02:00
Edward Welbourne
fc3be403d0 Remove some deprecation comments from qmap.h
Lars says documenting that the methods are slow is sufficient, no need
to deprecate them.

Task-number: QTBUG-85700
Change-Id: I7b1d19e91e30205df7d8198e3704cecc72a853e0
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-21 16:54:01 +02:00
Tor Arne Vestbø
ac43986aa5 Pass -arch when running toolchain configure test on Apple platforms
Clang doesn't automatically switch architecture just because we're
passing an iPhoneOS sysroot. In the past this resulted in a warning
about trying to link an x86_64 binary to arm64 libraries, but with
Xcode 12 this is now a hard error.

Fixes: QTBUG-86718
Pick-to: 5.15
Pick-to: 5.12
Change-Id: I7e9d2ca513d276029fc2a6cfe694a35fe41c39b3
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-21 14:51:33 +00:00
Kai Koehne
3b6ef98d7a headersclean: Fix include paths for dependent modules
Having ${QT_BUILD_DIR}/include as include path is not enough for
modules outside of qtbase. They also need to pick up headers from e.g.
Qt Core, which are available only in "${CMAKE_INSTALL_PREFIX}/include"

This amends db21bad936

Fixes: QTBUG-82615
Change-Id: Ib003a66ce039bf1ab6e21a3b1cd86923207eb3db
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-09-21 14:51:15 +00:00
Allan Sandfeld Jensen
5f198584e2 Define inverted QRects consistently
Changes the definition of invalid QRects to be more consistent.
This simplifies the logic, and makes it possible for us to fix
normalized() so dimensions don't change.

The actual API is not changed except for inverted rects.

Only one use-case for the old normalized() function existed,
and has been reimplemented as QRect::span().

Fixes: QTBUG-22934
Change-Id: I29dad2952dc6c8e84a6d931898dc7e43d66780f3
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-21 15:04:51 +02:00
Timur Pocheptsov
b8a0341178 QCocoaDrag::maybeDragMultipleItems - fix erroneous size check
Due to somewhat inverted logic introduced by the 8481a9fc97,
testing number of items in a pasteboard happens _before_ we fill it,
which is wrong and useless. As a result, maybeDragMultipleItems will
prevent the single item drag.

Pick-to: 5.15
Task-number: QTCREATORBUG-24665
Task-number: QTBUG-86786
Change-Id: Ia4be9fc56677575bb363cbb8b1adbea59e6c3b0b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-21 15:02:40 +02:00
Lars Knoll
f91531a056 Fix a bug when streaming QVariants containing a QRegExp
Fix a logic error. QRegExp is a UserType in Qt 6 and we need to
check for it in the right place.

Fixes an autotest failure in the qregexp autotest in qt5compat.

Change-Id: I454cfcfd12b36f756b24b69a5412455db9dccbe7
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
2020-09-21 14:57:27 +02:00
Lars Knoll
848927b688 Cleanup API of QMimeData
Do not use QVariant::Type anymore, instead use QMetaType

For some reason, this pushed the qvariant autotest over the limit where
MSVC requires the /bigobj flag, so add that one.

[ChangeLog][QtCore][QMimeData] The signature of the virtual retrieveData()
function has changed and now takes a QMetaType instead of a QVariant::Type.

Change-Id: Ib46773bd731ee2177b1ef74d8162d744be7017ef
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-21 14:56:09 +02:00
Volker Hilsheimer
cf015cd08b Silence qdoc warnings from std::filesystem
We change the declaration of the new APIs using std::filesystem::path for
qdoc runs, and need to forward declare it consistently for qdoc builds to
avoid a flood of clang warnings when building documentation.

Change-Id: Iddcf0ce7d6207b6cc5910790315ab21076bd6ce1
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-21 14:55:54 +02:00
Andrei Golubev
75d2cdf2ff Update QList's documentation relevant to prepend optimization
Task-number: QTBUG-84320
Change-Id: I550f9dd7810855df0b0cc2bcbc78a97d6abaac7a
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-21 14:42:02 +02:00
Volker Hilsheimer
33349e3fce Fix a bunch of qdoc warnings from QList types
For documentation purposes, we treat QList, QByteArrayList, and QStringList as
simple classes, whereas reality is a bit more complicated. We conditionally
change the declaration of the types for qdoc runs, and need to be consistent
to avoid a flood of warnings from clang when building documentation.

Change-Id: I22d529079e10f8fd3d93edc771e5f05729fa925f
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 13:45:58 +02:00
Kevin Funk
e59e924f52 dbus: Skip AUTOUIC on generated sources
Skip AUTOUIC on sources generated by the qt_add_dbus_interface and
qt_add_dbus_adaptor macros. Otherwise CMake will warn due to policy
CMP0071:

```
  For compatibility, CMake is excluding the GENERATED source file(s):

  (...)

  from processing by AUTOMOC and AUTOUIC. (...)
```

Pick-to: 5.15
Change-Id: I7d14b23c9343940964d5bc0d1d18fc19b41b5cd0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
2020-09-21 13:18:24 +02:00
Liang Qi
39b1dea2ec xcb: add xcb-util dependency for xcb-image
xcb-image includes xcb_aux.h, which is part of xcb-util.

Fixes: QTBUG-86287
Pick-to: 5.15
Change-Id: I253308008c5baeb1d061ef19f516ae6ab6dff52c
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-21 12:00:12 +02:00
Inho Lee
2a7d6e2779 Support signed integer attributes on QRHI
Previous UIntAttributes feature is renamed as IntAttributes.

Change-Id: I4b4a87a0eebf37291da832605f7bee8fb2d4e62b
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
2020-09-21 11:36:14 +02:00
Liu Yang
0148c6925e QAbstractEventDispatcher: change event dispatcher timer interval to qint64
Resolve remaining Qt6 TODO

[ChangeLog][QtCore][QAbstractEventDispatcher] The signature of the abstract virtual registerTime function now takes a qint64 value for the interval parameter.

Change-Id: I10166ad5cfb455edc404d465a3731ff094a8977e
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-21 09:30:54 +00:00
Lars Knoll
0e681064b5 Deprecate QMutex in recursive mode
Use QRecursiveMutex instead.

Pick-to: 5.15
Change-Id: I862fc2b3143deeb5c96dc8d445be5f9fa2535670
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-21 10:55:02 +02:00
Christian Heimlich
10bc093d4f Add reentrancy guard for processEvents() in QProgressDialog::setValue()
Current implementation of QProgressDialog always calls
QCoreApplication::processEvents() when the user calls
QProgressDialog::setValue() if the PD is modal. For most cases this is
fine, but when using a Qt::WindowModal PD with setValue() connected to
a signal in another thread using Qt::QueuedConnection a reentrancy
issue is present if setValue() is triggered too frequently as the
execution of its previous call may not have finished. If this happens
too many times in a row a stack overflow will occur.

Current documentation notes this potential issue but offers no way it
avoid it while still using QProgressDialog (user must implement a
custom dialog) without resorting to using Qt::BlockingQueuedConnection,
which unnecessarily reduces performance.

Introduces the boolean reentrancy guard "processingEvents" that is
checked before calling QCoreApplication::processEvents() in a modal
PD when setValue() is used. It is set before the first call to
processEvents() and cleared after that call returns. This ensures that
only one invocation of processEvents() is possible from within
setValue() at a time, and thereby minimizes iterations of the main event
loop and eliminates the aforementioned stack overflow condition.

See - https://forum.qt.io/topic/118292/

Fixes: QTBUG-10561
Pick-to: 5.15
Change-Id: Ifa9b91cbb66881981356954ead0906bdc91fab60
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
2020-09-21 03:19:55 -04:00
Nico Vertriest
169f332eab Doc: Correct link errors qtbase
Task-number: QTBUG-86295
Change-Id: I27f6bbdadffb08a8794520a14dfe0e2334979575
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-21 08:17:41 +02:00
Kai Koehne
cccace0c10 qmake: Make use of QHash deterministic
As a build tool, qmake should produce deterministic outputs.

Pick-to: 5.15
Task-number: QTBUG-86675
Change-Id: Ifc855d6ddf025cdad3aa57aee79beabf9c6008e2
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2020-09-19 13:48:45 +02:00
Kai Koehne
fbefafe159 Fix dead link in thirdparty license documentation
bistream-vera is not a known license for SPDX. Instead use a DejaCode
URN. Handling of such URN's is done in a separate patch in qtools.

Pick-to: 5.15
Change-Id: I687507ab05d2d377a50dbc0a1037071a9de68341
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
2020-09-19 13:48:22 +02:00
Kai Koehne
5d8f6beb46 rcc: Make output deterministic for directories
QDirIterator is documented to be non-deterministic.

Fixes: QTBUG-86675
Pick-to: 5.15
Change-Id: I4161871a409bbaf85347ee6a60ef1189f56a1b22
Reviewed-by: hjk <hjk@qt.io>
2020-09-19 13:48:03 +02:00
Ahmad Samir
0da5726a43 QDir: add note to docs about isAbsolutePath(":foo") returning true
As can be seen in the _q_resolveEntryAndCreateLegacyEngine_recursive method
in QFileSystemEngine, paths starting with ':' are treated as QResources,
which means that from QFileInfo's POV they're "not relative", which is why
QDir::isAbsolutePath would return true.

Pick-to: 5.15 5.12
Change-Id: I701d08ce43ea707bc34c928e39bea0b83597a4b6
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-19 11:40:28 +02:00
Ulf Hermann
217a25a6bf QMetaType: Allow registration of mutable views and register iterables
In order to modify a container through an iterable, we need the original
container to be mutable. The iterable, then, is not a conversion of the
container, but rather a view on the container. The concept may be
extended to other types.

In order to facilitate this, provide a set of methods in QMetaType and
QVariant similar to the convert family. The new methods are non-const
and expect the original value to stay available during the life time of
the view.

Change-Id: I363621033f7fc600edcea2acb786820ccba49c86
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-19 11:14:36 +02:00
Ulf Hermann
5c808073af Extend QSequentialIterable and add QAssociativeIterable
And add mutable iterators. This requires some refactoring of the
existing iterators.

Task-number: QTBUG-81716
Change-Id: I61b3a3e8c0df5fd449679257a29d9f0c3d19c4f0
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-19 11:14:30 +02:00
Ulf Hermann
b30801f64d Un-export QVariantRef and QVariantPointer
Templates should not be exported.

Change-Id: I1378414a6e146eab125e43670e538afec00cd917
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-19 11:14:23 +02:00
Jesko von Monkiewitsch
43108bc6fa Rename QVarLengthArray's private realloc() to reallocate()
This will enable run-time debugging on Windows, using
_CRTDBG_MAP_MALLOC, which uses #define to override the
standard library memory management functions, including
realloc.

Fixes: QTBUG-86395
Change-Id: I51975dd74cab0ae8309436c86d17a59074c561e1
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
2020-09-19 10:55:52 +02:00
Ahmad Samir
340b60ea2b QDir: Use QDoc syntax
Replace Note/Note: with \note.

Change-Id: I9a4cd79836fced9d858a478304a03e6c4bccfed5
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-09-18 23:52:15 +02:00
Mårten Nordheim
107ff4c1d6 Q(Any|Utf8)StringView: move array size deduction feature to fromArray
The constructor taking an array literal will now stop at the first
null-terminator encountered.

And fromArray is introduced which only supports array literals.
Constructs a view of the full size. Explicit so it shouldn't be
surprising.

Change-Id: I1497c33a5c12453a95e87c990abe6335b2817081
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-18 23:34:52 +02:00
Mårten Nordheim
bbe7570ddc QByteArrayView: move array size deduction feature to fromArray
1. Make the ctor unable to construct a QByteArrayView from
array literals other than 'char'.
    With the new behavior it would either be (very likely) unintended to
    pass e.g. a std::byte array to the ctor. And it would be confusing
    because you would get different sizes based on signed-ness.
2. Introduce fromArray
    Only supports array literals. Constructs a view of the full size.
    Explicit so it shouldn't be surprising.

Change-Id: Ifdb55eb21057dfe7053b2561bd81e2c9825e9bc6
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
2020-09-18 23:34:49 +02:00
Giuseppe D'Angelo
7a5e0c5712 QNAM: try to send headers and body together
For HTTP connections, QNAM defaults to opening its TCP socket in
unbuffered mode. This means that Qt will send the data written
into the socket right to the kernel, queueing only if the kernel
says it doesn't want more data for the moment being.

QNAM itself then uses separate write() calls to write the HTTP
headers and the body of the request (like POST or PUT). These 2+
writes result in headers and body being sent over different TCP
segments -- even if, in principle, a POST with a few bytes of data
(e.g. a HTML form, or a REST or SOAP request) could fit in the same
segment as the request.

Multiple writes like this interact extremely poorly with other
TCP features, e.g. delayed ACKs, Nagle's algorithm and the like.
In a typical scenario, the kernel will send a segment containing just
the headers, wait for the ACK (which may be delayed), and only then
send the body (it wasn't sent before because Nagle was blocking it).
The reply at this point is immediate (because the server can process
the request and starts replying), but the delayed ACK is typically
40-50ms, and documented up to 500ms (!). If one uses QNAM to access a
service, this introduces unacceptable latency.

These multiple writes to the OS should be avoided.

The first thing that comes into mind is to use buffered sockets.
Now, there are good reasons to keep the socket unbuffered, so we
don't want to change that. But the deal breaker is that even buffered
sockets won't help in general: for instance, on Windows, a buffered
write will immediately detect that the socket is ready for write and
flush the buffer right away (not 100% sure of why this is necessary;
basically, after populating the QTcpSocket write buffer, Qt enables
a write socket notifier on the socket -- notifier that fires
synchronously and immediately, without even returning to the event
loop, and that causes the write buffer flush).

Linux of course offers the perfect solution: corking the socket via
TCP_CORK, which tells the kernel not to send the data right away but
to buffer it up to a timeout (or when the option gets disabled
again, whichever comes first). It's explicitly designed to support
the case of sending headers followed by something like a
sendfile(2). Setting this socket option moves the problem to
the kernel and we could happily keep issuing multiple writes.

Ça va sans dire, no other OS supports that option or any other
similar option.

We have therefore to deal with this in userspace: don't write in the
socket multiple times, but try and coalesce the write of the headers
with the writing of the data. This patch implements that, by storing
the headers and sending them together with the very first chunk of
data. If the data is small enough, this sends the entire request
in one TCP segment.

Interestingly enough, QNAM has a call setting TCP_NODELAY
currently commented out because Qt doesn't combine "HTTP requests"
(whatever that means). The call comes all the way back
from pre-public history (before 2011) (!). This patch doesn't
touch it.

Fixes: QTBUG-41907
Change-Id: Id555d14e0702c9f75c3134b18277692eb3659afe
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-18 23:19:41 +02:00