Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qfutureinterface_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QFUTUREINTERFACE_P_H
5#define QFUTUREINTERFACE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/private/qglobal_p.h>
19#include <QtCore/qelapsedtimer.h>
20#include <QtCore/qcoreevent.h>
21#include <QtCore/qlist.h>
22#include <QtCore/qwaitcondition.h>
23#include <QtCore/qrunnable.h>
24#include <QtCore/qthreadpool.h>
25#include <QtCore/qfutureinterface.h>
26#include <QtCore/qexception.h>
27
29
31
32// Although QFutureCallOutEvent and QFutureCallOutInterface are private,
33// for historical reasons they were used externally (in QtJambi, see
34// https://github.com/OmixVisualization/qtjambi), so we export them to
35// not break the pre-existing code.
36class Q_CORE_EXPORT QFutureCallOutEvent : public QEvent
37{
39public:
51
53 : QEvent(QEvent::FutureCallOut), callOutType(CallOutType(0)), index1(-1), index2(-1)
54 { }
55 explicit QFutureCallOutEvent(CallOutType callOutType, int index1 = -1)
56 : QEvent(QEvent::FutureCallOut), callOutType(callOutType), index1(index1), index2(-1)
57 { }
58 QFutureCallOutEvent(CallOutType callOutType, int index1, int index2)
59 : QEvent(QEvent::FutureCallOut), callOutType(callOutType), index1(index1), index2(index2)
60 { }
61
62 QFutureCallOutEvent(CallOutType callOutType, int index1, const QString &text)
63 : QEvent(QEvent::FutureCallOut),
64 callOutType(callOutType),
65 index1(index1),
66 index2(-1),
67 text(text)
68 { }
69
71 int index1;
72 int index2;
74};
75
76class Q_CORE_EXPORT QFutureCallOutInterface
77{
78public:
80 virtual void postCallOutEvent(const QFutureCallOutEvent &) = 0;
81 virtual void callOutInterfaceDisconnected() = 0;
82};
83
85{
86public:
89
90 // When the last QFuture<T> reference is removed, we need to make
91 // sure that data stored in the ResultStore is cleaned out.
92 // Since QFutureInterfaceBasePrivate can be shared between QFuture<T>
93 // and QFuture<void> objects, we use a separate ref. counter
94 // to keep track of QFuture<T> objects.
96 {
97 public:
98 inline RefCount(int r = 0, int rt = 0)
99 : m_refCount(r), m_refCountT(rt) {}
100 // Default ref counter for QFIBP
101 inline bool ref() { return m_refCount.ref(); }
102 inline bool deref() { return m_refCount.deref(); }
103 inline int load() const { return m_refCount.loadRelaxed(); }
104 // Ref counter for type T
105 inline bool refT() { return m_refCountT.ref(); }
106 inline bool derefT() { return m_refCountT.deref(); }
107 inline int loadT() const { return m_refCountT.loadRelaxed(); }
108
109 private:
110 QAtomicInt m_refCount;
111 QAtomicInt m_refCountT;
112 };
113
114 // T: accessed from executing thread
115 // Q: accessed from the waiting/querying thread
118 QList<QFutureCallOutInterface *> outputConnections;
122
123 union Data {
126
127#ifndef QT_NO_EXCEPTIONS
128 void setException(const std::exception_ptr &e)
129 {
133 }
134#endif
135
136 ~Data() { }
137 };
139
140 QRunnable *runnable = nullptr;
141 QThreadPool *m_pool = nullptr;
142 // Wrapper for continuation
143 std::function<void(const QFutureInterfaceBase &)> continuation;
145
147 QAtomicInt state; // reads and writes can happen unprotected, both must be atomic
148
149 int m_progressValue = 0; // TQ
151 {
152 int minimum = 0; // TQ
153 int maximum = 0; // TQ
155 };
156 QScopedPointer<ProgressData> m_progress;
157
159 bool launchAsync = false;
160 bool isValid = false;
161 bool hasException = false;
162
164 std::atomic<ContinuationState> continuationState { Default };
165
166 inline QThreadPool *pool() const
168
169 // Internal functions that does not change the mutex state.
170 // The mutex must be locked when calling these.
171 int internal_resultCount() const;
172 bool internal_isResultReadyAt(int index) const;
174 bool internal_updateProgressValue(int progress);
175 bool internal_updateProgress(int progress, const QString &progressText = QString());
176 void internal_setThrottled(bool enable);
177 void sendCallOut(const QFutureCallOutEvent &callOut);
178 void sendCallOuts(const QFutureCallOutEvent &callOut1, const QFutureCallOutEvent &callOut2);
181
183};
184
186
187#endif
\inmodule QtCore
Definition qatomic.h:112
bool ref() noexcept
bool deref() noexcept
T loadRelaxed() const noexcept
\inmodule QtCore
\inmodule QtCore
Definition qcoreevent.h:45
QFutureCallOutEvent(CallOutType callOutType, int index1, const QString &text)
QFutureCallOutEvent(CallOutType callOutType, int index1, int index2)
QFutureCallOutEvent(CallOutType callOutType, int index1=-1)
virtual ~QFutureCallOutInterface()
virtual void callOutInterfaceDisconnected()=0
virtual void postCallOutEvent(const QFutureCallOutEvent &)=0
std::atomic< ContinuationState > continuationState
bool internal_updateProgress(int progress, const QString &progressText=QString())
void sendCallOuts(const QFutureCallOutEvent &callOut1, const QFutureCallOutEvent &callOut2)
void sendCallOut(const QFutureCallOutEvent &callOut)
void setState(QFutureInterfaceBase::State state)
QList< QFutureCallOutInterface * > outputConnections
void disconnectOutputInterface(QFutureCallOutInterface *iface)
bool internal_updateProgressValue(int progress)
bool internal_isResultReadyAt(int index) const
std::function< void(const QFutureInterfaceBase &) continuation)
void connectOutputInterface(QFutureCallOutInterface *iface)
void internal_setThrottled(bool enable)
QFutureInterfaceBasePrivate * continuationData
QScopedPointer< ProgressData > m_progress
QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState)
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qrunnable.h:18
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qthreadpool.h:22
static QThreadPool * globalInstance()
Returns the global QThreadPool instance.
void setException(const QException &e)
QString text
Combined button and popup list for selecting options.
#define Q_DECL_EVENT_COMMON(Class)
Definition qcoreevent.h:20
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
GLuint index
[2]
GLboolean r
[2]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLboolean enable
#define QT_REQUIRE_CONFIG(feature)
unsigned char quint8
Definition qtypes.h:46
QFuture< void > future
[5]
QtPrivate::ExceptionStore m_exceptionStore
void setException(const std::exception_ptr &e)
QtPrivate::ResultStoreBase m_results