┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimeon Bird <[email protected]>2012-10-19 21:04:55 -0400
committerSimeon Bird <[email protected]>2012-10-19 21:05:54 -0400
commit4f6a2780eecca9b46a3ceac35c7bfe0c0ce502e4 (patch)
tree81d7e48dcc7890e8b067d346dc7d7270f142344e /src
parent1c6d0c316a1979728e404ac22cbeae6339a5cc0b (diff)
Fix race condition and deadlock in the version plugin
when listing directories is slow. BUG: 302264 FIXED-IN: 4.9.3
Diffstat (limited to 'src')
-rw-r--r--src/views/versioncontrol/updateitemstatesthread.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp
index f9746aadd..e07d72c76 100644
--- a/src/views/versioncontrol/updateitemstatesthread.cpp
+++ b/src/views/versioncontrol/updateitemstatesthread.cpp
@@ -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();