Go to file
Alex Trotsenko ee122077b0 Allow QWindowsPipe{Reader,Writer} to work with foreign event loops
When a foreign event loop that does not enter an alertable wait state
is running (which is also the case when a native dialog window is
modal), pipe handlers would freeze temporarily due to their APC
callbacks not being invoked.

We address this problem by moving the I/O callbacks to the Windows
thread pool, and only posting completion events to the main loop
from there. That makes the actual I/O completely independent from
any main loop, while the signal delivery works also with foreign
loops (because Qt event delivery uses Windows messages, which foreign
loops typically handle correctly).

As a nice side effect, performance (and in particular scalability)
is improved.

Several other approaches have been tried:
1) Using QWinEventNotifier was about a quarter slower and scaled much
   worse. Additionally, it also required a rather egregious hack to
   handle the (pathological) case of a single thread talking to both
   ends of a QLocalSocket synchronously.
2) Queuing APCs from the thread pool to the main thread and also
   posting wake-up events to its event loop, and handling I/O on the
   main thread; this performed roughly like this solution , but scaled
   half as well, and the separate wake-up path was still deemed hacky.
3) Only posting wake-up events to the main thread from the thread pool,
   and still handling I/O on the main thread; this still performed
   comparably to 2), and the pathological case was not handled at all.
4) Using this approach for reads and that of 3) for writes was slightly
   faster with big amounts of data, but scaled slightly worse, and the
   diverging implementations were deemed not desirable.

Fixes: QTBUG-64443
Change-Id: I1cd87c07db39f3b46a2683ce236d7eb67b5be549
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
2020-11-17 12:45:50 +02:00
.github/workflows GitHub Actions: Fix workflow file 2020-09-11 13:37:48 +02:00
bin CMake: Fix argument passing for configure.bat / qt-configure-module.bat 2020-10-30 08:22:30 +01:00
cmake CMake: Enable exceptions by default 2020-11-16 15:47:51 +00:00
coin CMake: Provide a qt-internal-configure-tests script 2020-10-26 15:23:25 +01:00
config.tests CMake: Skip regeneration of manual compile test project 2020-04-09 11:26:46 +02:00
dist Add Qt 6.0.0 changes file 2020-11-16 10:02:08 +02:00
doc Doc: Add external link to conan.io 2020-11-16 08:13:37 +01:00
examples Improve QtConcurrent ImageScaling example to demo new features 2020-11-12 08:56:14 +01:00
lib Purge all fonts 2015-08-18 19:59:14 +00:00
mkspecs Install 3rd party headers and meta for static builds 2020-11-16 13:08:04 +01:00
qmake QFileInfo: mark constructors as explicit 2020-11-15 18:30:16 +01:00
src Allow QWindowsPipe{Reader,Writer} to work with foreign event loops 2020-11-17 12:45:50 +02:00
tests Allow QWindowsPipe{Reader,Writer} to work with foreign event loops 2020-11-17 12:45:50 +02:00
util CMake: pro2cmake: Reformat scripts using black8 again 2020-11-12 15:25:06 +01:00
.cmake.conf CMake: Bump the minimum required CMake version to build Qt to 3.18 2020-11-03 13:06:14 +01:00
.gitattributes Give batch files CRLF line endings 2020-11-04 15:02:29 +00:00
.gitignore .gitignore: Qt Creator files cleanup 2020-09-25 07:50:15 +02:00
.lgtm.yml Skip LGTM analysis for the bootstrap library and tools 2020-07-16 01:04:34 +02:00
.prev_configure.cmake CMake: Fix detection of the ltcg feature 2020-11-06 22:03:50 +01:00
.prev_qt_cmdline.cmake CMake: Regenerate configure.cmake files 2020-09-28 15:48:17 +02:00
.qmake.conf Bump version 2019-12-17 12:41:31 +01:00
.tag Update the git-archive export options 2012-09-07 15:39:31 +02:00
CMakeLists.txt CMake: Do not set PKG_CONFIG_* environment variables 2020-11-12 08:51:25 +01:00
config_help.txt Android: fix configure help for --android-abis 2020-11-12 23:11:40 +02:00
configure configure: Fix call without options 2020-11-07 19:33:37 +01:00
configure.bat CMake: Fix Windows top-level configure.bat 2020-11-03 13:06:14 +01:00
configure.cmake CMake: Fix detection of the ltcg feature 2020-11-06 22:03:50 +01:00
configure.json By default don't try to use pkg-config when targeting Android 2020-09-28 15:48:17 +02:00
configure.pri Android: allow setting javac build version from the configure script 2020-09-16 20:55:08 +03:00
dependencies.yaml Re-add dependencies.yaml now that qt5.git wip/qt6 builds fine 2019-09-18 13:19:31 +02:00
INSTALL INSTALL: Remove outdated reference to Windows CE 2019-02-13 13:01:57 +00:00
LICENSE.FDL Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
LICENSE.GPL2 Add new license header templates and license files 2016-01-14 20:43:46 +00:00
LICENSE.GPL3 Add new license header templates and license files 2016-01-14 20:43:46 +00:00
LICENSE.GPL3-EXCEPT Add new license header templates and license files 2016-01-14 20:43:46 +00:00
LICENSE.LGPL3 Add new license header templates and license files 2016-01-14 20:43:46 +00:00
LICENSE.LGPLv3 Remove LICENSE.GPLv3, LICENSE.LGPLv21, LGPL_EXCEPTION.txt 2018-04-16 11:02:14 +00:00
LICENSE.QT-LICENSE-AGREEMENT Update enterprise license agreement v4.2.1 2019-12-18 13:07:19 +02:00
qt_cmdline.cmake CMake: Fixup outdated configure.cmake files 2020-11-10 14:23:09 +01:00
qtbase.pro Update qmake before building src 2020-08-19 18:25:51 +02:00
sync.profile Generate QUtf8StringView header file from qutf8stringview.h 2020-11-07 08:35:11 +00:00