thread/qthreadstorage.cpp

Switch to Source codePreprocessed file
LineSource CodeCoverage
1 -
2 -
3 -
4 -
5 -
6 -
7static QBasicMutex destructorsMutex; -
8typedef QVector<void (*)(void *)> DestructorMap; -
9static DestructorMap *destructors() { static QGlobalStatic<DestructorMap > thisGlobalStatic = { { (0) }, false }; if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { DestructorMap *x = new DestructorMap; if (!thisGlobalStatic.pointer.testAndSetOrdered(0, x)) delete x; else static QGlobalStaticDeleter<DestructorMap > cleanup(thisGlobalStatic); } return thisGlobalStatic.pointer.load(); }
never executed: delete x;
executed: return thisGlobalStatic.pointer.load();
Execution Count:3363
partially evaluated: !thisGlobalStatic.pointer.testAndSetOrdered(0, x)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:12
evaluated: !thisGlobalStatic.pointer.load()
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:3352
partially evaluated: !thisGlobalStatic.destroyed
TRUEFALSE
yes
Evaluation Count:12
no
Evaluation Count:0
0-3363
10 -
11QThreadStorageData::QThreadStorageData(void (*func)(void *)) -
12{ -
13 QMutexLocker locker(&destructorsMutex); -
14 DestructorMap *destr = destructors(); -
15 if (!destr) {
partially evaluated: !destr
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:370
0-370
16 QThreadData *data = QThreadData::current(); -
17 id = data->tls.count(); -
18 if(false)QMessageLogger("thread/qthreadstorage.cpp", 94, __PRETTY_FUNCTION__).debug("QThreadStorageData: Allocated id %d, destructor %p cannot be stored", id, func);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 94, __PRETTY_FUNCTION__).debug("QThreadStorageData: Allocated id %d, destructor %p cannot be stored", id, func);
never evaluated: false
0
19 return;
never executed: return;
0
20 } -
21 for (id = 0; id < destr->count(); id++) {
evaluated: id < destr->count()
TRUEFALSE
yes
Evaluation Count:585
yes
Evaluation Count:359
359-585
22 if (destr->at(id) == 0)
evaluated: destr->at(id) == 0
TRUEFALSE
yes
Evaluation Count:11
yes
Evaluation Count:574
11-574
23 break;
executed: break;
Execution Count:11
11
24 }
executed: }
Execution Count:574
574
25 if (id == destr->count()) {
evaluated: id == destr->count()
TRUEFALSE
yes
Evaluation Count:359
yes
Evaluation Count:11
11-359
26 destr->append(func); -
27 } else {
executed: }
Execution Count:359
359
28 (*destr)[id] = func; -
29 }
executed: }
Execution Count:11
11
30 if(false)QMessageLogger("thread/qthreadstorage.cpp", 106, __PRETTY_FUNCTION__).debug("QThreadStorageData: Allocated id %d, destructor %p", id, func);
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:370
never executed: QMessageLogger("thread/qthreadstorage.cpp", 106, __PRETTY_FUNCTION__).debug("QThreadStorageData: Allocated id %d, destructor %p", id, func);
0-370
31}
executed: }
Execution Count:370
370
32 -
33QThreadStorageData::~QThreadStorageData() -
34{ -
35 if(false)QMessageLogger("thread/qthreadstorage.cpp", 111, __PRETTY_FUNCTION__).debug("QThreadStorageData: Released id %d", id);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 111, __PRETTY_FUNCTION__).debug("QThreadStorageData: Released id %d", id);
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:368
0-368
36 QMutexLocker locker(&destructorsMutex); -
37 if (destructors())
partially evaluated: destructors()
TRUEFALSE
yes
Evaluation Count:368
no
Evaluation Count:0
0-368
38 (*destructors())[id] = 0;
executed: (*destructors())[id] = 0;
Execution Count:368
368
39}
executed: }
Execution Count:368
368
40 -
41void **QThreadStorageData::get() const -
42{ -
43 QThreadData *data = QThreadData::current(); -
44 if (!data) {
partially evaluated: !data
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7409468
0-7409468
45 QMessageLogger("thread/qthreadstorage.cpp", 121, __PRETTY_FUNCTION__).warning("QThreadStorage::get: QThreadStorage can only be used with threads started with QThread"); -
46 return 0;
never executed: return 0;
0
47 } -
48 QVector<void *> &tls = data->tls; -
49 if (tls.size() <= id)
evaluated: tls.size() <= id
TRUEFALSE
yes
Evaluation Count:1574
yes
Evaluation Count:7407895
1574-7407895
50 tls.resize(id + 1);
executed: tls.resize(id + 1);
Execution Count:1573
1573
51 void **v = &tls[id]; -
52 -
53 if(false)QMessageLogger("thread/qthreadstorage.cpp", 129, __PRETTY_FUNCTION__).debug("QThreadStorageData: Returning storage %d, data %p, for thread %p",
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7409469
0-7409469
54 id, 0
55 *v, 0
56 data->thread);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 129, __PRETTY_FUNCTION__).debug("QThreadStorageData: Returning storage %d, data %p, for thread %p", id, *v, data->thread);
0
57 -
58 return *v ? v : 0;
executed: return *v ? v : 0;
Execution Count:7409469
7409469
59} -
60 -
61void **QThreadStorageData::set(void *p) -
62{ -
63 QThreadData *data = QThreadData::current(); -
64 if (!data) {
partially evaluated: !data
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2467
0-2467
65 QMessageLogger("thread/qthreadstorage.cpp", 141, __PRETTY_FUNCTION__).warning("QThreadStorage::set: QThreadStorage can only be used with threads started with QThread"); -
66 return 0;
never executed: return 0;
0
67 } -
68 QVector<void *> &tls = data->tls; -
69 if (tls.size() <= id)
evaluated: tls.size() <= id
TRUEFALSE
yes
Evaluation Count:6
yes
Evaluation Count:2462
6-2462
70 tls.resize(id + 1);
executed: tls.resize(id + 1);
Execution Count:6
6
71 -
72 void *&value = tls[id]; -
73 -
74 if (value != 0) {
evaluated: value != 0
TRUEFALSE
yes
Evaluation Count:198
yes
Evaluation Count:2270
198-2270
75 if(false)QMessageLogger("thread/qthreadstorage.cpp", 151, __PRETTY_FUNCTION__).debug("QThreadStorageData: Deleting previous storage %d, data %p, for thread %p",
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:198
0-198
76 id, 0
77 value, 0
78 data->thread);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 151, __PRETTY_FUNCTION__).debug("QThreadStorageData: Deleting previous storage %d, data %p, for thread %p", id, value, data->thread);
0
79 -
80 QMutexLocker locker(&destructorsMutex); -
81 DestructorMap *destr = destructors(); -
82 void (*destructor)(void *) = destr ? destr->value(id) : 0;
partially evaluated: destr
TRUEFALSE
yes
Evaluation Count:198
no
Evaluation Count:0
0-198
83 locker.unlock(); -
84 -
85 void *q = value; -
86 value = 0; -
87 -
88 if (destructor)
partially evaluated: destructor
TRUEFALSE
yes
Evaluation Count:198
no
Evaluation Count:0
0-198
89 destructor(q);
executed: destructor(q);
Execution Count:198
198
90 }
executed: }
Execution Count:198
198
91 -
92 -
93 value = p; -
94 if(false)QMessageLogger("thread/qthreadstorage.cpp", 170, __PRETTY_FUNCTION__).debug("QThreadStorageData: Set storage %d for thread %p to %p", id, data->thread, p);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 170, __PRETTY_FUNCTION__).debug("QThreadStorageData: Set storage %d for thread %p to %p", id, data->thread, p);
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2468
0-2468
95 return &value;
executed: return &value;
Execution Count:2467
2467
96} -
97 -
98void QThreadStorageData::finish(void **p) -
99{ -
100 QVector<void *> *tls = reinterpret_cast<QVector<void *> *>(p); -
101 if (!tls || tls->isEmpty() || !destructors())
partially evaluated: !tls
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1717849
evaluated: tls->isEmpty()
TRUEFALSE
yes
Evaluation Count:1716984
yes
Evaluation Count:871
partially evaluated: !destructors()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:871
0-1717849
102 return;
executed: return;
Execution Count:1716986
1716986
103 -
104 if(false)QMessageLogger("thread/qthreadstorage.cpp", 180, __PRETTY_FUNCTION__).debug("QThreadStorageData: Destroying storage for thread %p", QThread::currentThread());
never executed: QMessageLogger("thread/qthreadstorage.cpp", 180, __PRETTY_FUNCTION__).debug("QThreadStorageData: Destroying storage for thread %p", QThread::currentThread());
partially evaluated: false
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:871
0-871
105 while (!tls->isEmpty()) {
evaluated: !tls->isEmpty()
TRUEFALSE
yes
Evaluation Count:2506
yes
Evaluation Count:871
871-2506
106 void *&value = tls->last(); -
107 void *q = value; -
108 value = 0; -
109 int i = tls->size() - 1; -
110 tls->resize(i); -
111 -
112 if (!q) {
evaluated: !q
TRUEFALSE
yes
Evaluation Count:1317
yes
Evaluation Count:1188
1188-1317
113 -
114 continue;
executed: continue;
Execution Count:1317
1317
115 } -
116 -
117 QMutexLocker locker(&destructorsMutex); -
118 void (*destructor)(void *) = destructors()->value(i); -
119 locker.unlock(); -
120 -
121 if (!destructor) {
partially evaluated: !destructor
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1189
0-1189
122 if (QThread::currentThread())
never evaluated: QThread::currentThread()
0
123 QMessageLogger("thread/qthreadstorage.cpp", 199, __PRETTY_FUNCTION__).warning("QThreadStorage: Thread %p exited after QThreadStorage %d destroyed", 0
124 QThread::currentThread(), i);
never executed: QMessageLogger("thread/qthreadstorage.cpp", 199, __PRETTY_FUNCTION__).warning("QThreadStorage: Thread %p exited after QThreadStorage %d destroyed", QThread::currentThread(), i);
0
125 continue;
never executed: continue;
0
126 } -
127 destructor(q); -
128 -
129 if (tls->size() > i) {
evaluated: tls->size() > i
TRUEFALSE
yes
Evaluation Count:16
yes
Evaluation Count:1173
16-1173
130 -
131 (*tls)[i] = 0; -
132 }
executed: }
Execution Count:16
16
133 }
executed: }
Execution Count:1189
1189
134 tls->clear(); -
135}
executed: }
Execution Count:871
871
136 -
137 -
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial