20#include "qplatformdefs.h"
21#include "QtCore/qthread.h"
22#include "QtCore/qmutex.h"
23#include "QtCore/qstack.h"
25#include "QtCore/qwaitcondition.h"
27#include "QtCore/qmap.h"
28#include "QtCore/qcoreapplication.h"
29#include "private/qobject_p.h"
36class QAbstractEventDispatcher;
89
90
91
92
93
94
95
96
97
98
99
119 return !isNull(data) && !isList(data);
121 static bool isList(quintptr data)
noexcept {
return data & 1; }
122 static bool isNull(quintptr data)
noexcept {
return data == 0; }
128 const auto d = data.load(std::memory_order_acquire);
129 if (isBindingStatus(d))
130 return reinterpret_cast<QBindingStatus *>(d);
138 return decodeList(data.load(std::memory_order_relaxed));
142 static List *decodeList(quintptr ptr)
noexcept
145 return reinterpret_cast<List *>(ptr & ~1);
150 static quintptr encodeBindingStatus(QBindingStatus *status)
noexcept
152 return quintptr(status);
155 static quintptr encodeList(List *list)
noexcept
157 return quintptr(list) | 1;
160 std::atomic<quintptr> data;
167class Q_CORE_EXPORT QDaemonThread :
public QThread
170 QDaemonThread(QObject *parent =
nullptr);
174class Q_AUTOTEST_EXPORT QThreadPrivate :
public QObjectPrivate
176 Q_DECLARE_PUBLIC(QThread)
179 QThreadPrivate(QThreadData *d =
nullptr);
182 void setPriority(QThread::Priority prio);
183 Qt::HANDLE threadId()
const noexcept;
185 mutable QMutex mutex;
186 QAtomicInt quitLockRef;
188 enum State : quint8 {
197 State threadState = NotStarted;
199 std::atomic<
bool> interruptionRequested =
false;
201 bool terminated =
false;
208 std::underlying_type_t<QThread::Priority> priority = QThread::InheritPriority;
210 bool wait(QMutexLocker<QMutex> &locker, QDeadlineTimer deadline);
212 QThread::QualityOfService serviceLevel = QThread::QualityOfService::Auto;
213 void setQualityOfServiceLevel(QThread::QualityOfService qosLevel);
215 qos_class_t nativeQualityOfServiceClass()
const;
219 QWaitCondition thread_done;
222 static void *start(
void *arg);
228 static unsigned int __stdcall start(
void *)
noexcept;
229 void finish(
bool lockAnyway =
true)
noexcept;
232 bool terminationEnabled, terminatePending;
235 static int idealThreadCount;
239 static QAbstractEventDispatcher *createEventDispatcher(QThreadData *data);
248 if (!quitLockRef.deref() && threadState == Running) {
249 QCoreApplication::instance()->postEvent(q_ptr,
new QEvent(QEvent::Quit));
253 QBindingStatus *bindingStatus()
255 return m_statusOrPendingObjects.bindingStatus();
259
260
261 QBindingStatus *addObjectWithPendingBindingStatusChange(QObject *obj);
262 void removeObjectWithPendingBindingStatusChange(QObject *obj);
265 QtPrivate::BindingStatusOrList m_statusOrPendingObjects = {};
266#ifndef Q_OS_INTEGRITY
297 Q_DECLARE_PUBLIC(QThread)
314 if (QThreadData *data = currentThreadData()) Q_LIKELY_BRANCH
316 return createCurrentThreadData();
320 { Q_ASSERT_X(thread !=
nullptr,
"QThread",
"internal error");
return thread->d_func()->data; }
338 {
return eventDispatcher.loadRelaxed() !=
nullptr; }
342 QAbstractEventDispatcher *ed = eventDispatcher.loadRelaxed();
350 QMutexLocker locker(&postEventList.mutex);
383 : threadData(threadData)
392 Q_DECLARE_PRIVATE(QThread)
void addEvent(const QPostEvent &ev)
qsizetype insertionOffset
QPostEvent(QObject *r, QEvent *e, int p)
QScopedScopeLevelCounter(QThreadData *threadData)
~QScopedScopeLevelCounter()
QStack< QEventLoop * > eventLoops
QAtomicPointer< QAbstractEventDispatcher > eventDispatcher
static QThreadData * current()
QThreadData(int initialRefCount=1)
bool requiresCoreApplication
static void clearCurrentThreadData()
QAtomicPointer< void > threadId
static QThreadData * get2(QThread *thread)
QAbstractEventDispatcher * ensureEventDispatcher()
QPostEventList postEventList
bool hasEventDispatcher() const
QAtomicPointer< QThread > thread
QAbstractEventDispatcher * createEventDispatcher()
static void setCurrentThread(QThread *)
static QAbstractEventDispatcher * createEventDispatcher(QThreadData *data)
QThreadPrivate(QThreadData *d=nullptr)
void removeObjectWithPendingBindingStatusChange(QObject *)
QBindingStatus * m_bindingStatus
QBindingStatus * bindingStatus()
QBindingStatus * addObjectWithPendingBindingStatusChange(QObject *)
List * list() const noexcept
static bool isBindingStatus(quintptr data) noexcept
static bool isNull(quintptr data) noexcept
void removeObject(QObject *object)
void setStatusAndClearList(QBindingStatus *status) noexcept
constexpr BindingStatusOrList() noexcept
QBindingStatus * addObjectUnlessAlreadyStatus(QObject *object)
BindingStatusOrList(QBindingStatus *status) noexcept
QBindingStatus * bindingStatus() const noexcept
static bool isList(quintptr data) noexcept
Combined button and popup list for selecting options.
Q_DECLARE_TYPEINFO(QPostEvent, Q_RELOCATABLE_TYPE)
bool operator<(const QPostEvent &first, const QPostEvent &second)