From 17db162949e2392a6d57eea1e09515c78e166365 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 12 Apr 2021 09:23:16 +0200 Subject: [PATCH 1/4] doc: Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pick-to: 6.1 Change-Id: Ia4219d06e306b2abd2ac0977cac63ce0492c6397 Reviewed-by: MÃ¥rten Nordheim --- src/network/kernel/qnetworkinformation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/kernel/qnetworkinformation.cpp b/src/network/kernel/qnetworkinformation.cpp index d10024bf05e..0c41a3a42ef 100644 --- a/src/network/kernel/qnetworkinformation.cpp +++ b/src/network/kernel/qnetworkinformation.cpp @@ -432,7 +432,7 @@ QNetworkInformationBackendFactory::~QNetworkInformationBackendFactory() \value Unknown If this value is returned then we may be connected but the OS - has still not confirmed full connectivity, or this features + has still not confirmed full connectivity, or this feature is not supported. \value Disconnected Indicates that the system may have no connectivity at all. From 8194f790533fbd2c499feb1187774caab7eceb47 Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Mon, 12 Apr 2021 11:34:24 +0200 Subject: [PATCH 2/4] Use bracket-based escaping for all list arguments in a configure string The 'list(TRANSFORM cmake_args REPLACE "\\[\\[;\\]\\]" "\\\\;")' call breaks the list arguments added when evaluating the 'INPUT_' values. Therefore, it's necessary to apply bracket-based escaping to all list arguments instead of the standard escaping. Amends 856fadf85ca2a3b70878d01d32e4d4cef807b8a9 Fixes: QTBUG-92459 Change-Id: Ifd4e0ca5f549a1c7fab9ceb587ed355250c4e677 Reviewed-by: Alexandru Croitor --- cmake/QtProcessConfigureArgs.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index 330de3e6b33..8d4cef232bf 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -596,7 +596,7 @@ endmacro() macro(translate_list_input name cmake_var) if(DEFINED INPUT_${name}) - list(JOIN INPUT_${name} "\\;" value) + list(JOIN INPUT_${name} "[[;]]" value) list(APPEND cmake_args "-D${cmake_var}=${value}") drop_input(${name}) endif() @@ -763,7 +763,7 @@ if(nr_of_build_configs EQUAL 1) push("-DCMAKE_BUILD_TYPE=${build_configs}") elseif(nr_of_build_configs GREATER 1) set(multi_config ON) - string(REPLACE ";" "\\;" escaped_build_configs "${build_configs}") + string(REPLACE ";" "[[;]]" escaped_build_configs "${build_configs}") # We must not use the push macro here to avoid variable expansion. # That would destroy our escaping. list(APPEND cmake_args "-DCMAKE_CONFIGURATION_TYPES=${escaped_build_configs}") From b86176abf6a66b20cebbcb53958229590b4c2253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Wed, 7 Apr 2021 15:22:30 +0200 Subject: [PATCH 3/4] QtConcurrentIterateKernel: fix warning src\concurrent\qtconcurrentiteratekernel.cpp(134): warning C5055: operator '*': deprecated between enumerations and floating-point types Pick-to: 6.0 6.1 Change-Id: I934e767e77e9393e1da3adc390dc8e252e7f5b6a Reviewed-by: Jarek Kobus Reviewed-by: Sona Kurazyan --- src/concurrent/qtconcurrentiteratekernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/concurrent/qtconcurrentiteratekernel.cpp b/src/concurrent/qtconcurrentiteratekernel.cpp index 430ae89c856..268db562465 100644 --- a/src/concurrent/qtconcurrentiteratekernel.cpp +++ b/src/concurrent/qtconcurrentiteratekernel.cpp @@ -131,7 +131,7 @@ void BlockSizeManager::timeAfterUser() if (controlPartElapsed.isMedianValid() == false) return; - if (controlPartElapsed.median() * TargetRatio < userPartElapsed.median()) + if (controlPartElapsed.median() * int(TargetRatio) < userPartElapsed.median()) return; m_blockSize = qMin(m_blockSize * 2, maxBlockSize); From bb85831e4de5e2c4951a0c40003ccf36f57cbd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Wed, 7 Apr 2021 14:27:21 +0200 Subject: [PATCH 4/4] QtFuture::connect: disconnect signals first During reportFinished we may call a continuation which might end up triggering one of the signals. Pick-to: 6.0 6.1 Change-Id: I19546fcca12be71cd536e4287eb5eddd9d236830 Reviewed-by: Sona Kurazyan Reviewed-by: Fabian Kosmale --- src/corelib/thread/qfuture_impl.h | 14 +++++++------- .../corelib/thread/qfuture/tst_qfuture.cpp | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h index 8e7ba0c4b59..e455a74793d 100644 --- a/src/corelib/thread/qfuture_impl.h +++ b/src/corelib/thread/qfuture_impl.h @@ -807,34 +807,34 @@ static QFuture> connect(Sender *sender, Signal signal) if constexpr (std::is_void_v) { connections->first = QObject::connect(sender, signal, sender, [promise, connections]() mutable { - promise.reportFinished(); QObject::disconnect(connections->first); QObject::disconnect(connections->second); + promise.reportFinished(); }); } else if constexpr (QtPrivate::isTupleV) { connections->first = QObject::connect(sender, signal, sender, [promise, connections](auto... values) mutable { - promise.reportResult(std::make_tuple(values...)); - promise.reportFinished(); QObject::disconnect(connections->first); QObject::disconnect(connections->second); + promise.reportResult(std::make_tuple(values...)); + promise.reportFinished(); }); } else { connections->first = QObject::connect(sender, signal, sender, [promise, connections](ArgsType value) mutable { - promise.reportResult(value); - promise.reportFinished(); QObject::disconnect(connections->first); QObject::disconnect(connections->second); + promise.reportResult(value); + promise.reportFinished(); }); } connections->second = QObject::connect(sender, &QObject::destroyed, sender, [promise, connections]() mutable { - promise.reportCanceled(); - promise.reportFinished(); QObject::disconnect(connections->first); QObject::disconnect(connections->second); + promise.reportCanceled(); + promise.reportFinished(); }); return promise.future(); diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp index 71cfbd054b7..5f6267ec7d6 100644 --- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp +++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp @@ -3228,6 +3228,25 @@ void tst_QFuture::signalConnect() QVERIFY(future.isCanceled()); QVERIFY(!future.isValid()); } + + // Signal emitted, causing Sender to be destroyed + { + SenderObject *sender = new SenderObject(); + + auto future = QtFuture::connect(sender, &SenderObject::intArgSignal); + future.then([sender](int) { + // Scenario: Sender no longer needed, so it's deleted + delete sender; + }); + + QSignalSpy spy(sender, &SenderObject::destroyed); + emit sender->intArgSignal(5); + spy.wait(); + + QVERIFY(future.isFinished()); + QVERIFY(!future.isCanceled()); + QVERIFY(future.isValid()); + } } void tst_QFuture::waitForFinished()