From d41db62154dfbf6cb78f6a64e962939a79eec03c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 12 Jul 2023 17:57:58 +0200 Subject: [PATCH] Move QBasicFutureWatcher behind the ABI boundary ... and out of QtPrivate. No inline API requires it anymore, so move it into the only TU using it. Can't move it into the unnamed namespace because of the friend declaration in QFutureInterfaceBase. Pick-to: 6.6 Change-Id: I27452960492bc1193a4d0eaeb2acd913d4dd02a5 Reviewed-by: Ivan Solovev --- src/corelib/CMakeLists.txt | 1 - src/corelib/thread/qbasicfuturewatcher.cpp | 80 --------------------- src/corelib/thread/qbasicfuturewatcher.h | 39 ---------- src/corelib/thread/qfuture_impl.h | 1 - src/corelib/thread/qfutureinterface.cpp | 82 +++++++++++++++++++++- src/corelib/thread/qfutureinterface.h | 4 +- 6 files changed, 83 insertions(+), 124 deletions(-) delete mode 100644 src/corelib/thread/qbasicfuturewatcher.cpp delete mode 100644 src/corelib/thread/qbasicfuturewatcher.h diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 40eb758d4f8..f2da2c2b109 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -700,7 +700,6 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND LINUX qt_internal_extend_target(Core CONDITION QT_FEATURE_future SOURCES thread/qexception.cpp thread/qexception.h - thread/qbasicfuturewatcher.cpp thread/qbasicfuturewatcher.h thread/qfuture.h thread/qfuture_impl.h thread/qfutureinterface.cpp thread/qfutureinterface.h thread/qfutureinterface_p.h diff --git a/src/corelib/thread/qbasicfuturewatcher.cpp b/src/corelib/thread/qbasicfuturewatcher.cpp deleted file mode 100644 index 2602995e8fa..00000000000 --- a/src/corelib/thread/qbasicfuturewatcher.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#include "qbasicfuturewatcher.h" -#include "qcoreapplication.h" -#include "qfutureinterface.h" -#include "qfutureinterface_p.h" - -#include - -QT_BEGIN_NAMESPACE - -namespace QtPrivate { - -class QBasicFutureWatcherPrivate : public QObjectPrivate, QFutureCallOutInterface -{ -public: - Q_DECLARE_PUBLIC(QBasicFutureWatcher) - - QFutureInterfaceBase future; - - void postCallOutEvent(const QFutureCallOutEvent &event) override; - void callOutInterfaceDisconnected() override; -}; - -void QBasicFutureWatcherPrivate::postCallOutEvent(const QFutureCallOutEvent &event) -{ - Q_Q(QBasicFutureWatcher); - if (q->thread() == QThread::currentThread()) { - // If we are in the same thread, don't queue up anything. - std::unique_ptr clonedEvent(event.clone()); - QCoreApplication::sendEvent(q, clonedEvent.get()); - } else { - QCoreApplication::postEvent(q, event.clone()); - } -} - -void QBasicFutureWatcherPrivate::callOutInterfaceDisconnected() -{ - Q_Q(QBasicFutureWatcher); - QCoreApplication::removePostedEvents(q, QEvent::FutureCallOut); -} - -/* - * QBasicFutureWatcher is a more lightweight version of QFutureWatcher for internal use - */ -QBasicFutureWatcher::QBasicFutureWatcher(QObject *parent) - : QObject(*new QBasicFutureWatcherPrivate, parent) -{ -} - -QBasicFutureWatcher::~QBasicFutureWatcher() -{ - Q_D(QBasicFutureWatcher); - d->future.d->disconnectOutputInterface(d); -} - -void QBasicFutureWatcher::setFuture(QFutureInterfaceBase &fi) -{ - Q_D(QBasicFutureWatcher); - d->future = fi; - d->future.d->connectOutputInterface(d); -} - -bool QtPrivate::QBasicFutureWatcher::event(QEvent *event) -{ - if (event->type() == QEvent::FutureCallOut) { - QFutureCallOutEvent *callOutEvent = static_cast(event); - if (callOutEvent->callOutType == QFutureCallOutEvent::Finished) - emit finished(); - return true; - } - return QObject::event(event); -} - -} // namespace QtPrivate - -QT_END_NAMESPACE - -#include "moc_qbasicfuturewatcher.cpp" diff --git a/src/corelib/thread/qbasicfuturewatcher.h b/src/corelib/thread/qbasicfuturewatcher.h deleted file mode 100644 index 49db7284e70..00000000000 --- a/src/corelib/thread/qbasicfuturewatcher.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#ifndef QBASICFUTUREWATCHER_H -#define QBASICFUTUREWATCHER_H - -#include - -QT_REQUIRE_CONFIG(future); - -QT_BEGIN_NAMESPACE - -class QFutureInterfaceBase; - -namespace QtPrivate { - -class QBasicFutureWatcherPrivate; - -class Q_CORE_EXPORT QBasicFutureWatcher : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QBasicFutureWatcher) -public: - explicit QBasicFutureWatcher(QObject *parent = nullptr); - ~QBasicFutureWatcher() override; - - void setFuture(QFutureInterfaceBase &fi); - - bool event(QEvent *event) override; - -Q_SIGNALS: - void finished(); -}; - -} - -QT_END_NAMESPACE - -#endif // QBASICFUTUREWATCHER_H diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h index d8fe946b923..8f0b2821635 100644 --- a/src/corelib/thread/qfuture_impl.h +++ b/src/corelib/thread/qfuture_impl.h @@ -11,7 +11,6 @@ #endif #include -#include #include #include #include diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp index de936005c34..d8aeb76951c 100644 --- a/src/corelib/thread/qfutureinterface.cpp +++ b/src/corelib/thread/qfutureinterface.cpp @@ -4,9 +4,9 @@ // qfutureinterface.h included from qfuture.h #include "qfuture.h" #include "qfutureinterface_p.h" -#include "qbasicfuturewatcher.h" #include +#include #include #include #include // for qYieldCpu() @@ -45,6 +45,84 @@ const auto suspendingOrSuspended = } // unnamed namespace +class QBasicFutureWatcherPrivate; +class QBasicFutureWatcher : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QBasicFutureWatcher) +public: + explicit QBasicFutureWatcher(QObject *parent = nullptr); + ~QBasicFutureWatcher() override; + + void setFuture(QFutureInterfaceBase &fi); + + bool event(QEvent *event) override; + +Q_SIGNALS: + void finished(); +}; + +class QBasicFutureWatcherPrivate : public QObjectPrivate, QFutureCallOutInterface +{ +public: + Q_DECLARE_PUBLIC(QBasicFutureWatcher) + + QFutureInterfaceBase future; + + void postCallOutEvent(const QFutureCallOutEvent &event) override; + void callOutInterfaceDisconnected() override; +}; + +void QBasicFutureWatcherPrivate::postCallOutEvent(const QFutureCallOutEvent &event) +{ + Q_Q(QBasicFutureWatcher); + if (q->thread() == QThread::currentThread()) { + // If we are in the same thread, don't queue up anything. + std::unique_ptr clonedEvent(event.clone()); + QCoreApplication::sendEvent(q, clonedEvent.get()); + } else { + QCoreApplication::postEvent(q, event.clone()); + } +} + +void QBasicFutureWatcherPrivate::callOutInterfaceDisconnected() +{ + Q_Q(QBasicFutureWatcher); + QCoreApplication::removePostedEvents(q, QEvent::FutureCallOut); +} + +/* + * QBasicFutureWatcher is a more lightweight version of QFutureWatcher for internal use + */ +QBasicFutureWatcher::QBasicFutureWatcher(QObject *parent) + : QObject(*new QBasicFutureWatcherPrivate, parent) +{ +} + +QBasicFutureWatcher::~QBasicFutureWatcher() +{ + Q_D(QBasicFutureWatcher); + d->future.d->disconnectOutputInterface(d); +} + +void QBasicFutureWatcher::setFuture(QFutureInterfaceBase &fi) +{ + Q_D(QBasicFutureWatcher); + d->future = fi; + d->future.d->connectOutputInterface(d); +} + +bool QBasicFutureWatcher::event(QEvent *event) +{ + if (event->type() == QEvent::FutureCallOut) { + QFutureCallOutEvent *callOutEvent = static_cast(event); + if (callOutEvent->callOutType == QFutureCallOutEvent::Finished) + emit finished(); + return true; + } + return QObject::event(event); +} + void QtPrivate::watchContinuationImpl(const QObject *context, QSlotObjectBase *slotObj, QFutureInterfaceBase &fi) { @@ -942,3 +1020,5 @@ QFuture makeReadyVoidFuture() } // namespace QtFuture QT_END_NAMESPACE + +#include "qfutureinterface.moc" diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h index 4db3ebb8596..151584e66bc 100644 --- a/src/corelib/thread/qfutureinterface.h +++ b/src/corelib/thread/qfutureinterface.h @@ -39,8 +39,8 @@ template class FailureHandler; #endif -class QBasicFutureWatcher; } +class QBasicFutureWatcher; class Q_CORE_EXPORT QFutureInterfaceBase { @@ -178,7 +178,7 @@ private: friend class QtPrivate::FailureHandler; #endif - friend class QtPrivate::QBasicFutureWatcher; + friend class QBasicFutureWatcher; template friend class QPromise;