8#include <QtCore/qatomic.h>
9#include <QtCore/qcoreapplication.h>
10#include <QtCore/qthread.h>
11#include <QtCore/qvarlengtharray.h>
12#include <private/qthreadpool_p.h>
13#include <private/qobject_p.h>
27class ThreadPoolThreadReleaser {
34 ~ThreadPoolThreadReleaser()
35 {
if (m_pool) m_pool->reserveThread(); }
38const auto suspendingOrSuspended =
72 auto watcherMutex = std::make_shared<QRecursiveMutex>();
73 const auto destroyWatcher = [watcherMutex,
watcher]()
mutable {
83 context, [slot = std::move(slot)] {
84 void *
args[] = {
nullptr };
85 slot->call(
nullptr,
args);
123 return a.fetchAndOrRelaxed(which) | which;
128 return a.fetchAndAndRelaxed(~which) & ~which;
133 const auto adjusted = [&](
int old) {
return (old & ~from) | to; };
134 int value =
a.loadRelaxed();
260#if QT_DEPRECATED_SINCE(6, 0)
261bool QFutureInterfaceBase::isPaused()
const
322 const auto canSuspend = [] (
int state) {
330 if (!canSuspend(
state))
336 if (!canSuspend(
state))
402#ifndef QT_NO_EXCEPTIONS
412#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
419 if (
d->state.loadRelaxed() & (Canceled|Finished))
422 d->hasException =
true;
423 d->data.setException(exception);
425 d->waitCondition.wakeAll();
426 d->pausedWaitCondition.wakeAll();
482 const int waitIndex = (resultIndex == -1) ? INT_MAX : resultIndex;
496 if (!alreadyFinished) {
688 :
state(initialState)
696 data.m_exceptionStore.~ExceptionStore();
698 data.m_results.~ResultStoreBase();
716 if (
data.m_results.hasNextResult())
720 &&
data.m_results.hasNextResult() ==
false)
724 &&
data.m_results.hasNextResult();
796 iface->postCallOutEvent(callOutEvent1);
797 iface->postCallOutEvent(callOutEvent2);
831 const int begin =
it.resultIndex();
862 iface->callOutInterfaceDisconnected();
892 qWarning() <<
"Adding a continuation to a future which already has a continuation. "
893 "The existing continuation is overwritten.";
950 QFutureInterface<void> promise;
951 promise.reportStarted();
952 promise.reportFinished();
954 return promise.future();
961#include "qfutureinterface.moc"
void storeRelaxed(T newValue) noexcept
T loadRelaxed() const noexcept
void invalidate() noexcept
Marks this QElapsedTimer object as invalid.
qint64 elapsed() const noexcept
Returns the number of milliseconds since this QElapsedTimer was last started.
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
bool isValid() const noexcept
Returns false if the timer has never been started or invalidated by a call to invalidate().
virtual void raise() const
In your QException subclass, reimplement raise() like this:
virtual ~QFutureCallOutInterface()
virtual void postCallOutEvent(const QFutureCallOutEvent &)=0
std::atomic< ContinuationState > continuationState
bool internal_updateProgress(int progress, const QString &progressText=QString())
QElapsedTimer progressTime
int m_expectedResultCount
QBasicMutex continuationMutex
void sendCallOuts(const QFutureCallOutEvent &callOut1, const QFutureCallOutEvent &callOut2)
void sendCallOut(const QFutureCallOutEvent &callOut)
bool internal_waitForNextResult()
void setState(QFutureInterfaceBase::State state)
QList< QFutureCallOutInterface * > outputConnections
void disconnectOutputInterface(QFutureCallOutInterface *iface)
bool internal_updateProgressValue(int progress)
bool internal_isResultReadyAt(int index) const
QThreadPool * pool() const
std::function< void(const QFutureInterfaceBase &) continuation)
void connectOutputInterface(QFutureCallOutInterface *iface)
void internal_setThrottled(bool enable)
int internal_resultCount() const
QWaitCondition pausedWaitCondition
~QFutureInterfaceBasePrivate()
QWaitCondition waitCondition
QFutureInterfaceBasePrivate * continuationData
QScopedPointer< ProgressData > m_progress
QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState)
QtPrivate::ExceptionStore & exceptionStore()
QThreadPool * threadPool() const
int progressMaximum() const
QtPrivate::ResultStoreBase & resultStoreBase()
void waitForResult(int resultIndex)
bool queryState(State state) const
bool isProgressUpdateNeeded() const
void setThreadPool(QThreadPool *pool)
void setExpectedResultCount(int resultCount)
void suspendIfRequested()
QFutureInterfaceBase(State initialState=NoState)
void reportResultsReady(int beginIndex, int endIndex)
void setContinuation(std::function< void(const QFutureInterfaceBase &)> func)
void setLaunchAsync(bool value)
bool derefT() const noexcept
void setThrottled(bool enable)
void setSuspended(bool suspend)
virtual ~QFutureInterfaceBase()
bool isSuspending() const
int progressValue() const
void setProgressValue(int progressValue)
void setProgressRange(int minimum, int maximum)
QFutureInterfaceBase & operator=(const QFutureInterfaceBase &other)
void swap(QFutureInterfaceBase &other) noexcept
void rethrowPossibleException()
bool refT() const noexcept
int progressMinimum() const
void reportException(const QException &e)
QString progressText() const
void runContinuation() const
void setProgressValueAndText(int progressValue, const QString &progressText)
int expectedResultCount()
void setRunnable(QRunnable *runnable)
bool isRunningOrPending() const
bool isChainCanceled() const
bool hasException() const
void setFilterMode(bool enable)
void reportSuspended() const
bool isResultReadyAt(int index) const
qsizetype size() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
QObjectContinuationWrapper(QObject *parent=nullptr)
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
void deleteLater()
\threadsafe
\macro QT_RESTRICTED_CAST_FROM_ASCII
void releaseThread()
Releases a thread previously reserved by a call to reserveThread().
bool wait(QMutex *, QDeadlineTimer=QDeadlineTimer(QDeadlineTimer::Forever))
Q_NORETURN void rethrowException() const
void setFilterMode(bool enable)
QSet< QString >::iterator it
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
Q_CORE_EXPORT QFuture< void > makeReadyVoidFuture()
void Q_CORE_EXPORT watchContinuationImpl(const QObject *context, QtPrivate::QSlotObjectBase *slotObj, QFutureInterfaceBase &fi)
std::unique_ptr< QSlotObjectBase, QSlotObjectBase::Deleter > SlotObjUniquePtr
static jboolean copy(JNIEnv *, jobject)
#define QT_WARNING_DISABLE_GCC(text)
#define Q_IMPL_EVENT_COMMON(Class)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
@ MaxProgressEmitsPerSecond
static int switch_from_to(QAtomicInt &a, int from, int to)
static int switch_off(QAtomicInt &a, int which)
static int switch_on(QAtomicInt &a, int which)
constexpr const T & qMax(const T &a, const T &b)
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QT_BEGIN_NAMESPACE constexpr void qSwap(T &value1, T &value2) noexcept(std::is_nothrow_swappable_v< T >)
QT_BEGIN_NAMESPACE Q_ALWAYS_INLINE void qYieldCpu(void) Q_DECL_NOEXCEPT
QFutureWatcher< int > watcher
const QSemaphoreReleaser releaser(sem)
[4]
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
QtPrivate::ExceptionStore m_exceptionStore
QtPrivate::ResultStoreBase m_results