X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d3496b12310d9fec0e52e537c341e87fcaa2f8b5..b4800d794ce2f900f64decdf4974cd3edffe9b67:/src/views/versioncontrol/updateitemstatesthread.cpp diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index e6bd761cc..e07d72c76 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -19,6 +19,8 @@ #include "updateitemstatesthread.h" +#include + #include UpdateItemStatesThread::UpdateItemStatesThread() : @@ -43,10 +45,12 @@ UpdateItemStatesThread::~UpdateItemStatesThread() void UpdateItemStatesThread::setData(KVersionControlPlugin* plugin, const QList& 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; } @@ -55,22 +59,29 @@ void UpdateItemStatesThread::run() Q_ASSERT(!m_itemStates.isEmpty()); Q_ASSERT(m_plugin); - // The items from m_itemStates may be located in different directory levels. The version - // plugin requires the root directory for KVersionControlPlugin::beginRetrieval(). Instead - // of doing an expensive search, we utilize the knowledge of the implementation of - // VersionControlObserver::addDirectory() to be sure that the last item contains the root. QMutexLocker itemLocker(&m_itemMutex); - const QString directory = m_itemStates.last().item.url().directory(KUrl::AppendTrailingSlash); + + 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(); - for (int i = 0; i < count; ++i) { - m_itemStates[i].version = m_plugin->versionState(m_itemStates[i].item); + + KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); + if (pluginV2) { + for (int i = 0; i < count; ++i) { + m_itemStates[i].version = pluginV2->itemVersion(m_itemStates[i].item); + } + } else { + for (int i = 0; i < count; ++i) { + const KVersionControlPlugin::VersionState state = m_plugin->versionState(m_itemStates[i].item); + m_itemStates[i].version = static_cast(state); + } } + m_plugin->endRetrieval(); m_retrievedItems = true; }