X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/caf017c2fefa8280046b02cfd071a118f2909ced..87cd992e85effd14938f67c0671ef2e7cb93a8a7:/src/versioncontrol/updateitemstatesthread.cpp diff --git a/src/versioncontrol/updateitemstatesthread.cpp b/src/versioncontrol/updateitemstatesthread.cpp index 0cd5b93e1..57c4481c3 100644 --- a/src/versioncontrol/updateitemstatesthread.cpp +++ b/src/versioncontrol/updateitemstatesthread.cpp @@ -19,17 +19,21 @@ #include "updateitemstatesthread.h" +#include + UpdateItemStatesThread::UpdateItemStatesThread() : QThread(), - m_retrievedItems(false), - m_mutex(0), + m_globalPluginMutex(0), + m_plugin(0), + m_itemMutex(), + m_retrievedItems(false), m_itemStates() { // Several threads may share one instance of a plugin. A global // mutex is required to serialize the retrieval of version control // states inside run(). static QMutex globalMutex; - m_mutex = &globalMutex; + m_globalPluginMutex = &globalMutex; } UpdateItemStatesThread::~UpdateItemStatesThread() @@ -39,8 +43,11 @@ UpdateItemStatesThread::~UpdateItemStatesThread() void UpdateItemStatesThread::setData(KVersionControlPlugin* plugin, const QList& itemStates) { - m_plugin = plugin; + QMutexLocker itemLocker(&m_itemMutex); m_itemStates = itemStates; + + QMutexLocker pluginLocker(m_globalPluginMutex); + m_plugin = plugin; } void UpdateItemStatesThread::run() @@ -52,11 +59,14 @@ void UpdateItemStatesThread::run() // 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); + itemLocker.unlock(); - QMutexLocker locker(m_mutex); + 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); @@ -66,23 +76,25 @@ void UpdateItemStatesThread::run() } } -bool UpdateItemStatesThread::beginReadItemStates() +bool UpdateItemStatesThread::lockPlugin() { - return m_mutex->tryLock(300); + return m_globalPluginMutex->tryLock(300); } -void UpdateItemStatesThread::endReadItemStates() +void UpdateItemStatesThread::unlockPlugin() { - m_mutex->unlock(); + m_globalPluginMutex->unlock(); } QList UpdateItemStatesThread::itemStates() const { + QMutexLocker locker(&m_itemMutex); return m_itemStates; } bool UpdateItemStatesThread::retrievedItems() const { + QMutexLocker locker(&m_itemMutex); return m_retrievedItems; }