From: Peter Penz Date: Fri, 6 Nov 2009 16:27:19 +0000 (+0000) Subject: Fixed issues when several LoadItemStatesThreads access one plugin or when the Version... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/8fbb88475517cb055617ba375c8f0747f6f646e7 Fixed issues when several LoadItemStatesThreads access one plugin or when the VersionControlObserver is deleted during thread execution. svn path=/trunk/KDE/kdebase/apps/; revision=1045694 --- diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index d1f7e9d64..b58fd8e1b 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -31,7 +31,6 @@ #include "draganddrophelper.h" #include "folderexpander.h" #include "tooltips/tooltipmanager.h" -#include "versioncontrol/versioncontrolobserver.h" #include "viewextensionsfactory.h" #include "zoomlevelinfo.h" @@ -126,13 +125,6 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, connect(KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), this, SLOT(updateFont())); - /*FolderExpander* folderExpander = new FolderExpander(this, m_proxyModel); - folderExpander->setEnabled(DolphinSettings::instance().generalSettings()->autoExpandFolders()); - connect (folderExpander, SIGNAL(enterDir(const QModelIndex&)), - m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); - - new VersionControlObserver(this);*/ - DolphinController* controller = m_container->m_controller; connect(controller, SIGNAL(zoomLevelChanged(int)), this, SLOT(setZoomLevel(int))); diff --git a/src/versioncontrol/updateitemstatesthread.cpp b/src/versioncontrol/updateitemstatesthread.cpp index 7483e056e..3ac74a11b 100644 --- a/src/versioncontrol/updateitemstatesthread.cpp +++ b/src/versioncontrol/updateitemstatesthread.cpp @@ -19,12 +19,14 @@ #include "updateitemstatesthread.h" -UpdateItemStatesThread::UpdateItemStatesThread(QObject* parent) : - QThread(parent), +UpdateItemStatesThread::UpdateItemStatesThread() : + QThread(), m_retrievedItems(false), - m_mutex(QMutex::Recursive), + m_mutex(0), m_itemStates() { + static QMutex globalMutex; + m_mutex = &globalMutex; } UpdateItemStatesThread::~UpdateItemStatesThread() @@ -49,7 +51,7 @@ void UpdateItemStatesThread::run() // VersionControlObserver::addDirectory() to be sure that the last item contains the root. const QString directory = m_itemStates.last().item.url().directory(KUrl::AppendTrailingSlash); - QMutexLocker locker(&m_mutex); + QMutexLocker locker(m_mutex); m_retrievedItems = false; if (m_plugin->beginRetrieval(directory)) { const int count = m_itemStates.count(); @@ -63,12 +65,12 @@ void UpdateItemStatesThread::run() bool UpdateItemStatesThread::beginReadItemStates() { - return m_mutex.tryLock(300); + return m_mutex->tryLock(300); } void UpdateItemStatesThread::endReadItemStates() { - m_mutex.unlock(); + m_mutex->unlock(); } QList UpdateItemStatesThread::itemStates() const diff --git a/src/versioncontrol/updateitemstatesthread.h b/src/versioncontrol/updateitemstatesthread.h index 36768d0e9..bee5c02c0 100644 --- a/src/versioncontrol/updateitemstatesthread.h +++ b/src/versioncontrol/updateitemstatesthread.h @@ -38,7 +38,7 @@ class LIBDOLPHINPRIVATE_EXPORT UpdateItemStatesThread : public QThread Q_OBJECT public: - UpdateItemStatesThread(QObject* parent); + UpdateItemStatesThread(); virtual ~UpdateItemStatesThread(); void setData(KVersionControlPlugin* plugin, @@ -61,7 +61,7 @@ private slots: private: bool m_retrievedItems; KVersionControlPlugin* m_plugin; - QMutex m_mutex; + QMutex* m_mutex; QList m_itemStates; }; diff --git a/src/versioncontrol/versioncontrolobserver.cpp b/src/versioncontrol/versioncontrolobserver.cpp index aea60b28d..9e52d1f51 100644 --- a/src/versioncontrol/versioncontrolobserver.cpp +++ b/src/versioncontrol/versioncontrolobserver.cpp @@ -75,9 +75,16 @@ VersionControlObserver::~VersionControlObserver() if (m_updateItemStatesThread != 0) { disconnect(m_updateItemStatesThread, SIGNAL(finished()), this, SLOT(applyUpdatedItemStates())); - m_updateItemStatesThread->deleteWhenFinished(); + if (m_updateItemStatesThread->isFinished()) { + delete m_updateItemStatesThread; + } else { + m_updateItemStatesThread->deleteWhenFinished(); + } m_updateItemStatesThread = 0; } + + m_plugin->disconnect(); + m_plugin = 0; } QList VersionControlObserver::contextMenuActions(const KFileItemList& items) const @@ -211,7 +218,7 @@ void VersionControlObserver::updateItemStates() { Q_ASSERT(m_plugin != 0); if (m_updateItemStatesThread == 0) { - m_updateItemStatesThread = new UpdateItemStatesThread(this); + m_updateItemStatesThread = new UpdateItemStatesThread(); connect(m_updateItemStatesThread, SIGNAL(finished()), this, SLOT(applyUpdatedItemStates())); }