summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
authorMorten Engvoldsen <morten.engvoldsen@nokia.com>2010-10-07 19:23:54 (GMT)
committerMorten Engvoldsen <morten.engvoldsen@nokia.com>2010-10-07 19:23:54 (GMT)
commit4f1d524f992b0df3626ab63c001345c96ccea766 (patch)
treeddc248c09fbb041b09792dae680b2f494e9b4e4b /src/corelib/thread
parent34c8022c216f6e298b0b0f8250cdf17688534c5b (diff)
parent161f15e1e79ec5f23244da68340ba1e78f3ac4bb (diff)
downloadQt-4f1d524f992b0df3626ab63c001345c96ccea766.zip
Qt-4f1d524f992b0df3626ab63c001345c96ccea766.tar.gz
Qt-4f1d524f992b0df3626ab63c001345c96ccea766.tar.bz2
Merge branch '4.7' of git@scm.dev.nokia.troll.no:qt/oslo-staging-1 into 4.7
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qthreadstorage.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp
index 88d73cc..2fc04f5 100644
--- a/src/corelib/thread/qthreadstorage.cpp
+++ b/src/corelib/thread/qthreadstorage.cpp
@@ -79,6 +79,21 @@ QThreadStorageData::QThreadStorageData(void (*func)(void *))
{
QMutexLocker locker(mutex());
DestructorMap *destr = destructors();
+ if (!destr) {
+ /*
+ the destructors vector has already been destroyed, yet a new
+ QThreadStorage is being allocated. this can only happen during global
+ destruction, at which point we assume that there is only one thread.
+ in order to keep QThreadStorage working, we need somewhere to store
+ the data, best place we have in this situation is at the tail of the
+ current thread's tls vector. the destructor is ignored, since we have
+ no where to store it, and no way to actually call it.
+ */
+ QThreadData *data = QThreadData::current();
+ id = data->tls.count();
+ DEBUG_MSG("QThreadStorageData: Allocated id %d, destructor %p cannot be stored", id, func);
+ return;
+ }
for (id = 0; id < destr->count(); id++) {
if (destr->at(id) == 0)
break;
@@ -139,13 +154,15 @@ void **QThreadStorageData::set(void *p)
data->thread);
QMutexLocker locker(mutex());
- void (*destructor)(void *) = destructors()->value(id);
+ DestructorMap *destr = destructors();
+ void (*destructor)(void *) = destr ? destr->value(id) : 0;
locker.unlock();
void *q = value;
value = 0;
- destructor(q);
+ if (destructor)
+ destructor(q);
}
// store new data