X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/896ee459af10c73d20d0ae093b4c02348ffedb18..87cd992e85effd14938f67c0671ef2e7cb93a8a7:/src/versioncontrol/updateitemstatesthread.cpp diff --git a/src/versioncontrol/updateitemstatesthread.cpp b/src/versioncontrol/updateitemstatesthread.cpp index 7483e056e..57c4481c3 100644 --- a/src/versioncontrol/updateitemstatesthread.cpp +++ b/src/versioncontrol/updateitemstatesthread.cpp @@ -19,12 +19,21 @@ #include "updateitemstatesthread.h" -UpdateItemStatesThread::UpdateItemStatesThread(QObject* parent) : - QThread(parent), - m_retrievedItems(false), - m_mutex(QMutex::Recursive), +#include + +UpdateItemStatesThread::UpdateItemStatesThread() : + QThread(), + 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_globalPluginMutex = &globalMutex; } UpdateItemStatesThread::~UpdateItemStatesThread() @@ -34,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() @@ -47,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); @@ -61,34 +76,26 @@ 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; } -void UpdateItemStatesThread::deleteWhenFinished() -{ - connect(this, SIGNAL(finished()), this, SLOT(slotFinished())); -} - -void UpdateItemStatesThread::slotFinished() -{ - deleteLater(); -} - #include "updateitemstatesthread.moc"