src/corelib/thread/qthread.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
   171 /*
   171 /*
   172   QThreadPrivate
   172   QThreadPrivate
   173 */
   173 */
   174 
   174 
   175 QThreadPrivate::QThreadPrivate(QThreadData *d)
   175 QThreadPrivate::QThreadPrivate(QThreadData *d)
   176     : QObjectPrivate(), running(false), finished(false), terminated(false),
   176     : QObjectPrivate(), running(false), finished(false), terminated(false), exited(false), returnCode(-1),
   177       stackSize(0), priority(QThread::InheritPriority), data(d)
   177       stackSize(0), priority(QThread::InheritPriority), data(d)
   178 {
   178 {
   179 #if defined (Q_OS_UNIX)
   179 #if defined (Q_OS_UNIX)
   180     thread_id = 0;
   180     thread_id = 0;
   181 #elif defined (Q_WS_WIN)
   181 #elif defined (Q_WS_WIN)
   480 int QThread::exec()
   480 int QThread::exec()
   481 {
   481 {
   482     Q_D(QThread);
   482     Q_D(QThread);
   483     QMutexLocker locker(&d->mutex);
   483     QMutexLocker locker(&d->mutex);
   484     d->data->quitNow = false;
   484     d->data->quitNow = false;
       
   485     if (d->exited)
       
   486         return d->returnCode;
       
   487     locker.unlock();
       
   488 
   485     QEventLoop eventLoop;
   489     QEventLoop eventLoop;
   486     locker.unlock();
       
   487     int returnCode = eventLoop.exec();
   490     int returnCode = eventLoop.exec();
       
   491 
       
   492     locker.relock();
       
   493     d->exited = false;
       
   494     d->returnCode = -1;
   488     return returnCode;
   495     return returnCode;
   489 }
   496 }
   490 
   497 
   491 /*!
   498 /*!
   492     Tells the thread's event loop to exit with a return code.
   499     Tells the thread's event loop to exit with a return code.
   509 */
   516 */
   510 void QThread::exit(int returnCode)
   517 void QThread::exit(int returnCode)
   511 {
   518 {
   512     Q_D(QThread);
   519     Q_D(QThread);
   513     QMutexLocker locker(&d->mutex);
   520     QMutexLocker locker(&d->mutex);
       
   521     d->exited = true;
       
   522     d->returnCode = returnCode;
   514     d->data->quitNow = true;
   523     d->data->quitNow = true;
   515     for (int i = 0; i < d->data->eventLoops.size(); ++i) {
   524     for (int i = 0; i < d->data->eventLoops.size(); ++i) {
   516         QEventLoop *eventLoop = d->data->eventLoops.at(i);
   525         QEventLoop *eventLoop = d->data->eventLoops.at(i);
   517         eventLoop->exit(returnCode);
   526         eventLoop->exit(returnCode);
   518     }
   527     }
   615 */
   624 */
   616 QThread::Priority QThread::priority() const
   625 QThread::Priority QThread::priority() const
   617 {
   626 {
   618     Q_D(const QThread);
   627     Q_D(const QThread);
   619     QMutexLocker locker(&d->mutex);
   628     QMutexLocker locker(&d->mutex);
   620     return d->priority;
   629 
       
   630     // mask off the high bits that are used for flags
       
   631     return Priority(d->priority & 0xffff);
   621 }
   632 }
   622 
   633 
   623 /*!
   634 /*!
   624     \fn void QThread::sleep(unsigned long secs)
   635     \fn void QThread::sleep(unsigned long secs)
   625 
   636