UpdateItemStatesThread kept a pointer reference to m_plugin whose
lifetime was tied to VersionControlObserver parents.
On application shutdown it could happen the thread is still running when
the Observer is destroyed.
Make the plugin pointer a weak reference, allowing to stop the thread
when the plugin is gone.
BUG: 477425
void UpdateItemStatesThread::run()
{
Q_ASSERT(!m_itemStates.isEmpty());
void UpdateItemStatesThread::run()
{
Q_ASSERT(!m_itemStates.isEmpty());
+ if (!m_plugin) {
+ return;
+ }
QMutexLocker pluginLocker(m_globalPluginMutex);
QMap<QString, QVector<VersionControlObserver::ItemState>>::iterator it = m_itemStates.begin();
QMutexLocker pluginLocker(m_globalPluginMutex);
QMap<QString, QVector<VersionControlObserver::ItemState>>::iterator it = m_itemStates.begin();
- for (; it != m_itemStates.end(); ++it) {
+ for (; it != m_itemStates.end() && m_plugin; ++it) {
if (m_plugin->beginRetrieval(it.key())) {
QVector<VersionControlObserver::ItemState> &items = it.value();
const int count = items.count();
if (m_plugin->beginRetrieval(it.key())) {
QVector<VersionControlObserver::ItemState> &items = it.value();
const int count = items.count();
- for (int i = 0; i < count; ++i) {
+ for (int i = 0; i < count && m_plugin; ++i) {
const KFileItem &item = items.at(i).first;
const KVersionControlPlugin::ItemVersion version = m_plugin->itemVersion(item);
items[i].second = version;
}
}
const KFileItem &item = items.at(i).first;
const KVersionControlPlugin::ItemVersion version = m_plugin->itemVersion(item);
items[i].second = version;
}
}
- m_plugin->endRetrieval();
+ if (m_plugin) {
+ m_plugin->endRetrieval();
+ }
#include "views/versioncontrol/versioncontrolobserver.h"
#include <QMutex>
#include "views/versioncontrol/versioncontrolobserver.h"
#include <QMutex>
private:
QMutex *m_globalPluginMutex; // Protects the m_plugin globally
private:
QMutex *m_globalPluginMutex; // Protects the m_plugin globally
- KVersionControlPlugin *m_plugin;
+ QPointer<KVersionControlPlugin> m_plugin;
QMap<QString, QVector<VersionControlObserver::ItemState>> m_itemStates;
};
QMap<QString, QVector<VersionControlObserver::ItemState>> m_itemStates;
};