qthread.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/thread/qthread.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10QThreadData::QThreadData(int initialRefCount)-
11 : _ref(initialRefCount), loopLevel(0), scopeLevel(0), thread(0), threadId(0),-
12 eventDispatcher(0),-
13 quitNow(false), canWait(true), isAdopted(false), requiresCoreApplication(true)-
14{-
15-
16}
executed 582058 times by 680 tests: end of block
Executed by:
  • tst_Collections
  • tst_Compiler
  • tst_Gestures
  • tst_Lancelot
  • tst_LargeFile
  • tst_ModelTest
  • tst_NetworkSelfTest
  • tst_PlatformSocketEngine
  • tst_QAbstractAnimation
  • tst_QAbstractButton
  • tst_QAbstractFileEngine
  • tst_QAbstractItemModel
  • tst_QAbstractItemView
  • tst_QAbstractNetworkCache
  • tst_QAbstractPrintDialog
  • tst_QAbstractProxyModel
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSocket
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QAlgorithms
  • ...
582058
17-
18QThreadData::~QThreadData()-
19{-
20 ((!(_ref.load() == 0)) ? qt_assert("_ref.load() == 0",__FILE__,6168) : qt_noop());-
21-
22-
23-
24-
25-
26-
27-
28 if (this->thread == QCoreApplicationPrivate::theMainThread) {-
29 QCoreApplicationPrivate::theMainThread = 0;-
30 QThreadData::clearCurrentThreadData();-
31 }-
32-
33 QThread *t = thread;-
34 thread = 0;-
35 delete t;-
36-
37 for (int i = 0; i < postEventList.size(); ++i) {-
38 const QPostEvent &pe = postEventList.at(i);-
39 if (pe.event) {-
40 --pe.receiver->d_func()->postedEvents;-
41 pe.event->posted = false;-
42 delete pe.event;-
43 }-
44 }-
45-
46-
47}-
48-
49void QThreadData::ref()-
50{-
51-
52 (void) _ref.ref();-
53 ((!(_ref.load() != 0)) ? qt_assert("_ref.load() != 0",__FILE__,94101) : qt_noop());-
54-
55}-
56-
57void QThreadData::deref()-
58{-
59-
60 if (!_ref.deref())-
61 delete this;-
62-
63}-
64-
65-
66-
67-
68-
69QAdoptedThread::QAdoptedThread(QThreadData *data)-
70 : QThread(*new QThreadPrivate(data))-
71{-
72-
73-
74-
75 d_func()->running = true;-
76 d_func()->finished = false;-
77 init();-
78-
79-
80-
81}-
82-
83QAdoptedThread::~QAdoptedThread()-
84{-
85-
86}-
87-
88void QAdoptedThread::run()-
89{-
90-
91 QMessageLogger(__FILE__, 132139, __PRETTY_FUNCTION__).fatal("QAdoptedThread::run(): Internal error, this implementation should never be called.");-
92}-
93-
94-
95-
96-
97-
98QThreadPrivate::QThreadPrivate(QThreadData *d)-
99 : QObjectPrivate(), running(false), finished(false),-
100 isInFinish(false), interruptionRequested(false),-
101 exited(false), returnCode(-1),-
102 stackSize(0), priority(QThread::InheritPriority), data(d)-
103{-
104 if (!data)-
105 data = new QThreadData;-
106}-
107-
108QThreadPrivate::~QThreadPrivate()-
109{-
110 data->deref();-
111}-
112QThread *QThread::currentThread()-
113{-
114 QThreadData *data = QThreadData::current();-
115 ((!(data != 0)) ? qt_assert("data != 0",__FILE__,364371) : qt_noop());-
116 return data->thread;-
117}-
118QThread::QThread(QObject *parent)-
119 : QObject(*(new QThreadPrivate), parent)-
120{-
121 QThreadPrivate * const d = d_func();-
122-
123 d->data->thread = this;-
124}-
125-
126-
127-
128-
129QThread::QThread(QThreadPrivate &dd, QObject *parent)-
130 : QObject(dd, parent)-
131{-
132 QThreadPrivate * const d = d_func();-
133-
134 d->data->thread = this;-
135}-
136QThread::~QThread()-
137{-
138 QThreadPrivate * const d = d_func();-
139 {-
140 QMutexLocker locker(&d->mutex);-
141 if (d->isInFinish) {-
142 locker.unlock();-
143 wait();-
144 locker.relock();-
145 }-
146 if (d->running && !d->finished && !d->data->isAdopted)-
147 QMessageLogger(__FILE__, 414421, __PRETTY_FUNCTION__).warning("QThread: Destroyed while thread is still running");-
148-
149 d->data->thread = 0;-
150 }-
151}-
152-
153-
154-
155-
156-
157-
158bool QThread::isFinished() const-
159{-
160 const QThreadPrivate * const d = d_func();-
161 QMutexLocker locker(&d->mutex);-
162 return d->finished || d->isInFinish;-
163}-
164-
165-
166-
167-
168-
169-
170bool QThread::isRunning() const-
171{-
172 const QThreadPrivate * const d = d_func();-
173 QMutexLocker locker(&d->mutex);-
174 return d->running && !d->isInFinish;-
175}-
176void QThread::setStackSize(uint stackSize)-
177{-
178 QThreadPrivate * const d = d_func();-
179 QMutexLocker locker(&d->mutex);-
180 ((!(!d->running)) ? qt_assert_x("QThread::setStackSize", "cannot change stack size while the thread is running",-
181 __FILE__-
182 ,-
183 461468-
184 ) : qt_noop())-
185 ;-
186 d->stackSize = stackSize;-
187}-
188-
189-
190-
191-
192-
193-
194-
195uint QThread::stackSize() const-
196{-
197 const QThreadPrivate * const d = d_func();-
198 QMutexLocker locker(&d->mutex);-
199 return d->stackSize;-
200}-
201int QThread::exec()-
202{-
203 QThreadPrivate * const d = d_func();-
204 QMutexLocker locker(&d->mutex);-
205 d->data->quitNow = false;-
206 if (d->exited) {-
207 d->exited = false;-
208 return d->returnCode;-
209 }-
210 locker.unlock();-
211-
212 QEventLoop eventLoop;-
213 int returnCode = eventLoop.exec();-
214-
215 locker.relock();-
216 d->exited = false;-
217 d->returnCode = -1;-
218 return returnCode;-
219}-
220void QThread::exit(int returnCode)-
221{-
222 QThreadPrivate * const d = d_func();-
223 QMutexLocker locker(&d->mutex);-
224 d->exited = true;-
225 d->returnCode = returnCode;-
226 d->data->quitNow = true;-
227 for (int i = 0; i < d->data->eventLoops.size(); ++i) {-
228 QEventLoop *eventLoop = d->data->eventLoops.at(i);-
229 eventLoop->exit(returnCode);-
230 }-
231}-
232void QThread::quit()-
233{ exit(); }-
234void QThread::run()-
235{-
236 (void) exec();-
237}-
238void QThread::setPriority(Priority priority)-
239{-
240 QThreadPrivate * const d = d_func();-
241 QMutexLocker locker(&d->mutex);-
242 if (!d->running) {-
243 QMessageLogger(__FILE__, 594601, __PRETTY_FUNCTION__).warning("QThread::setPriority: Cannot set priority, thread is not running");-
244 return;-
245 }-
246 d->setPriority(priority);-
247}-
248QThread::Priority QThread::priority() const-
249{-
250 const QThreadPrivate * const d = d_func();-
251 QMutexLocker locker(&d->mutex);-
252-
253-
254 return Priority(d->priority & 0xffff);-
255}-
256int QThread::loopLevel() const-
257{-
258 const QThreadPrivate * const d = d_func();-
259 return d->data->eventLoops.size();-
260}-
261QAbstractEventDispatcher *QThread::eventDispatcher() const-
262{-
263 const QThreadPrivate * const d = d_func();-
264 return d->data->eventDispatcher.load();-
265}-
266void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)-
267{-
268 QThreadPrivate * const d = d_func();-
269 if (d->data->hasEventDispatcher()) {-
270 QMessageLogger(__FILE__, 788795, __PRETTY_FUNCTION__).warning("QThread::setEventDispatcher: An event dispatcher has already been created for this thread");-
271 } else {-
272 eventDispatcher->moveToThread(this);-
273 if (eventDispatcher->thread() == this)-
274 d->data->eventDispatcher = eventDispatcher;-
275 else-
276 QMessageLogger(__FILE__, 794801, __PRETTY_FUNCTION__).warning("QThread::setEventDispatcher: Could not move event dispatcher to target thread");-
277 }-
278}-
279-
280-
281-
282-
283bool QThread::event(QEvent *event)-
284{-
285 if (event->type() == QEvent::Quit) {-
286 quit();-
287 return true;-
288 } else {-
289 return QObject::event(event);-
290 }-
291}-
292void QThread::requestInterruption()-
293{-
294 QThreadPrivate * const d = d_func();-
295 QMutexLocker locker(&d->mutex);-
296 if (!d->running || d->finished || d->isInFinish)-
297 return;-
298 if (this == QCoreApplicationPrivate::theMainThread) {-
299 QMessageLogger(__FILE__, 830837, __PRETTY_FUNCTION__).warning("QThread::requestInterruption has no effect on the main thread");-
300 return;-
301 }-
302 d->interruptionRequested = true;-
303}-
304bool QThread::isInterruptionRequested() const-
305{-
306 const QThreadPrivate * const d = d_func();-
307 QMutexLocker locker(&d->mutex);-
308 if (!d->running || d->finished || d->isInFinish)-
309 return false;-
310 return d->interruptionRequested;-
}
static void setThreadDoesNotRequireCoreApplication()
{
QThreadData::current()->requiresCoreApplication = false;
311}-
312QDaemonThread::QDaemonThread(QObject *parent)-
313 : QThread(parent)-
314{-
315-
316 connect(this, &QThread::started,-
317 setThreadDoesNotRequireCoreApplication);[](){ QThreadData::current()->requiresCoreApplication = false; }
executed 189 times by 161 tests: end of block
Executed by:
  • tst_Gestures
  • tst_ModelTest
  • tst_NetworkSelfTest
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractNetworkCache
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCoreApplication
  • tst_QDBusAbstractAdaptor
  • tst_QDBusAbstractInterface
  • ...
)
;
189
318}
executed 189 times by 161 tests: end of block
Executed by:
  • tst_Gestures
  • tst_ModelTest
  • tst_NetworkSelfTest
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractNetworkCache
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCoreApplication
  • tst_QDBusAbstractAdaptor
  • tst_QDBusAbstractInterface
  • ...
189
319-
320QDaemonThread::~QDaemonThread()-
321{-
322}-
323-
324-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9