/**************************************************************************** ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/ ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.0, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** In addition, as a special exception, Trolltech, as the sole copyright ** holder for Qt Designer, grants users of the Qt/Eclipse Integration ** plug-in the right for the Qt/Eclipse Integration to link to ** functionality provided by Qt Designer and its related libraries. ** ** Trolltech reserves all rights not expressly granted herein. ** ** Trolltech ASA (c) 2007 ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef QTHREAD_P_H #define QTHREAD_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of QAbstractItemModel*. This header file may change from version // to version without notice, or even be removed. // // We mean it. // // #include "qplatformdefs.h" #include "QtCore/qthread.h" #include "QtCore/qmutex.h" #include "QtCore/qstack.h" #include "QtCore/qwaitcondition.h" #include "QtCore/qhash.h" #include "private/qobject_p.h" class QAbstractEventDispatcher; class QEventLoop; class QPostEvent { public: QObject *receiver; QEvent *event; int priority; inline QPostEvent() : receiver(0), event(0), priority(0) { } inline QPostEvent(QObject *r, QEvent *e, int p) : receiver(r), event(e), priority(p) { } }; inline bool operator<(int priority, const QPostEvent &pe) { return pe.priority < priority; } inline bool operator<(const QPostEvent &pe, int priority) { return priority < pe.priority; } class QPostEventList : public QList { public: // recursion == recursion count for sendPostedEvents() int recursion; // offset == set by sendPostedEvents to tell postEvent() where to start insertions int offset; int numPostedEvents; QMutex mutex; inline QPostEventList() : QList(), recursion(0), offset(0), numPostedEvents(0) { } }; class Q_CORE_EXPORT QThreadData { QAtomic _ref; public: QThreadData(int initialRefCount = 1); ~QThreadData(); static QThreadData *current(); static QThreadData *get2(QThread *thread); void ref(); void deref(); QThread *thread; bool quitNow; QAbstractEventDispatcher *eventDispatcher; QStack eventLoops; QPostEventList postEventList; bool canWait; QHash tls; }; #ifndef QT_NO_THREAD class QThreadPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QThread) public: QThreadPrivate(QThreadData *d = 0); ~QThreadPrivate(); mutable QMutex mutex; bool running; bool finished; bool terminated; uint stackSize; QThread::Priority priority; static QThread *threadForId(int id); #ifdef Q_OS_UNIX pthread_t thread_id; QWaitCondition thread_done; static void *start(void *arg); static void finish(void *arg); #endif #ifdef Q_OS_WIN32 HANDLE handle; unsigned int id; int waiters; bool terminationEnabled, terminatePending; static unsigned int __stdcall start(void *); static void finish(void *, bool lockAnyway=true); #endif // Q_OS_WIN32 QThreadData *data; static void createEventDispatcher(QThreadData *data); }; // thread wrapper for the main() thread class QAdoptedThread : public QThread { Q_DECLARE_PRIVATE(QThread) public: QAdoptedThread(QThreadData *data = 0); ~QAdoptedThread(); void init(); static QThread *createThreadForAdoption(); private: inline void run() { // this function should never be called, it is implemented // only so that we can instantiate the object qFatal("QAdoptedThread::run(): Internal error, this implementation should never be called."); } }; #else // QT_NO_THREAD class QThreadPrivate : public QObjectPrivate { public: QThreadPrivate() : data(new QThreadData) {} ~QThreadPrivate() { delete data; } QThreadData *data; static void setCurrentThread(QThread*) {} static QThread *threadForId(int) { return QThread::currentThread(); } static void createEventDispatcher(QThreadData *data); Q_DECLARE_PUBLIC(QThread) }; #endif // QT_NO_THREAD #endif // QTHREAD_P_H