From 7f01d8851f912051b35af7dd078372c9970d45fe Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Mon, 29 Mar 2010 15:33:24 +1000 Subject: Make sure the image reader thread is shutdown properly Prevents deadlock on shutdown for very shortlived runs, e.g. autotests --- src/declarative/util/qdeclarativepixmapcache.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp index 1d90bf8..fe5863f 100644 --- a/src/declarative/util/qdeclarativepixmapcache.cpp +++ b/src/declarative/util/qdeclarativepixmapcache.cpp @@ -114,6 +114,7 @@ private: QList cancelled; QDeclarativeEngine *engine; QDeclarativeImageRequestHandler *handler; + QWaitCondition started; QMutex mutex; static QHash readers; @@ -370,8 +371,15 @@ QDeclarativeImageReader::~QDeclarativeImageReader() readers.remove(engine); readerMutex.unlock(); - quit(); - wait(); + if (isRunning()) { + quit(); + while (!wait(100)) { + // It is possible to for the quit to happen before exec() + // Need to wait until the event loop starts so that we + // can stop it. Particularly likely with an idle thread. + quit(); + } + } } QDeclarativeImageReader *QDeclarativeImageReader::instance(QDeclarativeEngine *engine) @@ -380,6 +388,7 @@ QDeclarativeImageReader *QDeclarativeImageReader::instance(QDeclarativeEngine *e QDeclarativeImageReader *reader = readers.value(engine); if (!reader) { reader = new QDeclarativeImageReader(engine); + reader->started.wait(&readerMutex); readers.insert(engine, reader); } readerMutex.unlock(); @@ -414,7 +423,10 @@ void QDeclarativeImageReader::cancel(QDeclarativePixmapReply *reply) void QDeclarativeImageReader::run() { + readerMutex.lock(); handler = new QDeclarativeImageRequestHandler(this, engine); + started.wakeAll(); + readerMutex.unlock(); exec(); -- cgit v0.12