diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index f84d3b80bb..522aff647f 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -683,7 +683,6 @@ qt_internal_extend_target(Core CONDITION QT_FEATURE_thread AND UNIX AND NOT APPL 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 2602995e8f..0000000000 --- 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 49db7284e7..0000000000 --- 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 d8fe946b92..8f0b282163 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 de936005c3..d8aeb76951 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 4db3ebb859..151584e66b 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;