]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix race condition and deadlock in the version plugin
authorSimeon Bird <spb@ias.edu>
Sat, 20 Oct 2012 01:04:55 +0000 (21:04 -0400)
committerSimeon Bird <spb@ias.edu>
Sat, 20 Oct 2012 01:05:54 +0000 (21:05 -0400)
when listing directories is slow.

BUG: 302264
FIXED-IN: 4.9.3

src/views/versioncontrol/updateitemstatesthread.cpp

index f9746aaddb3ec80452f3a158d4c91354c58b7e73..e07d72c76d380fb6dc1b112a3d2e95c1593e60ad 100644 (file)
@@ -45,10 +45,12 @@ UpdateItemStatesThread::~UpdateItemStatesThread()
 void UpdateItemStatesThread::setData(KVersionControlPlugin* plugin,
                                      const QList<VersionControlObserver::ItemState>& itemStates)
 {
+    // The locks are taken in the same order as in run()
+    // to avoid potential deadlock.
+    QMutexLocker pluginLocker(m_globalPluginMutex);
     QMutexLocker itemLocker(&m_itemMutex);
-    m_itemStates = itemStates;
 
-    QMutexLocker pluginLocker(m_globalPluginMutex);
+    m_itemStates = itemStates;
     m_plugin = plugin;
 }
 
@@ -58,11 +60,12 @@ void UpdateItemStatesThread::run()
     Q_ASSERT(m_plugin);
 
     QMutexLocker itemLocker(&m_itemMutex);
+
     const QString directory = m_itemStates.first().item.url().directory(KUrl::AppendTrailingSlash);
+    m_retrievedItems = false;
     itemLocker.unlock();
 
     QMutexLocker pluginLocker(m_globalPluginMutex);
-    m_retrievedItems = false;
     if (m_plugin->beginRetrieval(directory)) {
         itemLocker.relock();
         const int count = m_itemStates.count();