diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2021-04-07 14:27:21 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2021-04-12 12:37:40 +0200 |
commit | bb85831e4de5e2c4951a0c40003ccf36f57cbd93 (patch) | |
tree | a610703c71170a0202e24cb52ba824078b75eb73 /src/corelib/thread | |
parent | b86176abf6a66b20cebbcb53958229590b4c2253 (diff) |
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 <sona.kurazyan@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qfuture_impl.h | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h index 8e7ba0c4b5..e455a74793 100644 --- a/src/corelib/thread/qfuture_impl.h +++ b/src/corelib/thread/qfuture_impl.h @@ -807,34 +807,34 @@ static QFuture<ArgsType<Signal>> connect(Sender *sender, Signal signal) if constexpr (std::is_void_v<ArgsType>) { 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<ArgsType>) { 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(); |