Fix crash when accessing the content model.
authorChristian Kandeler <christian.kandeler@digia.com>
Fri, 19 Sep 2014 11:48:07 +0000 (13:48 +0200)
committerChristian Kandeler <christian.kandeler@digia.com>
Fri, 19 Sep 2014 14:06:51 +0000 (16:06 +0200)
1) Make sure invalidateContents() is called whenever the help engine's
   DB readers are destroyed.
2) In QHelpContentProvider::stopCollecting(), remove all root items, as
   they are invalid now: Their child items reference DB readers that
   are going to be destroyed.

Task-number: QTBUG-18829
Change-Id: Id9cc4ea99c43c36ad5c5d1f04157a68bac79d44a
Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
src/assistant/help/qhelpcontentwidget.cpp
src/assistant/help/qhelpenginecore.cpp
src/assistant/help/qhelpenginecore.h
src/assistant/help/qhelpindexwidget.cpp

index cf3838c..b3c7c9c 100644 (file)
@@ -220,22 +220,28 @@ void QHelpContentProvider::collectContents(const QString &customFilterName)
 
 void QHelpContentProvider::stopCollecting()
 {
-    if (!isRunning())
-        return;
-    m_mutex.lock();
-    m_abort = true;
-    m_mutex.unlock();
-    wait();
+    if (isRunning()) {
+        m_mutex.lock();
+        m_abort = true;
+        m_mutex.unlock();
+        wait();
+    }
+    qDeleteAll(m_rootItems);
+    m_rootItems.clear();
 }
 
 QHelpContentItem *QHelpContentProvider::rootItem()
 {
     QMutexLocker locker(&m_mutex);
+    if (m_rootItems.isEmpty())
+        return 0;
     return m_rootItems.dequeue();
 }
 
 int QHelpContentProvider::nextChildCount() const
 {
+    if (m_rootItems.isEmpty())
+        return 0;
     return m_rootItems.head()->childCount();
 }
 
@@ -349,7 +355,7 @@ QHelpContentModel::QHelpContentModel(QHelpEnginePrivate *helpEngine)
 
     connect(d->qhelpContentProvider, SIGNAL(finished()),
         this, SLOT(insertContents()), Qt::QueuedConnection);
-    connect(helpEngine->q, SIGNAL(setupStarted()), this, SLOT(invalidateContents()));
+    connect(helpEngine->q, SIGNAL(readersAboutToBeInvalidated()), this, SLOT(invalidateContents()));
 }
 
 /*!
index a2aeb73..3d5ba60 100644 (file)
@@ -79,6 +79,7 @@ QHelpEngineCorePrivate::~QHelpEngineCorePrivate()
 
 void QHelpEngineCorePrivate::clearMaps()
 {
+    emit q->readersAboutToBeInvalidated();
     QMap<QString, QHelpDBReader*>::iterator it = readerMap.begin();
     while (it != readerMap.end()) {
         delete it.value();
index 202b185..17e5dec 100644 (file)
@@ -116,6 +116,7 @@ Q_SIGNALS:
     void setupFinished();
     void currentFilterChanged(const QString &newFilter);
     void warning(const QString &msg);
+    void readersAboutToBeInvalidated();
 
 protected:
     QHelpEngineCore(QHelpEngineCorePrivate *helpEngineCorePrivate,
index 64c2e05..61f7841 100644 (file)
@@ -232,7 +232,7 @@ QHelpIndexModel::QHelpIndexModel(QHelpEnginePrivate *helpEngine)
     d = new QHelpIndexModelPrivate(helpEngine);
 
     connect(d->indexProvider, SIGNAL(finished()), this, SLOT(insertIndices()));
-    connect(helpEngine->q, SIGNAL(setupStarted()), this, SLOT(invalidateIndex()));
+    connect(helpEngine->q, SIGNAL(readersAboutToBeInvalidated()), this, SLOT(invalidateIndex()));
 }
 
 QHelpIndexModel::~QHelpIndexModel()