diff options
Diffstat (limited to 'src/versioncontrol/updateitemstatesthread.cpp')
| -rw-r--r-- | src/versioncontrol/updateitemstatesthread.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/versioncontrol/updateitemstatesthread.cpp b/src/versioncontrol/updateitemstatesthread.cpp index 0cd5b93e1..020cdb0d0 100644 --- a/src/versioncontrol/updateitemstatesthread.cpp +++ b/src/versioncontrol/updateitemstatesthread.cpp @@ -19,17 +19,21 @@ #include "updateitemstatesthread.h" +#include <QMutexLocker> + 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<VersionControlObserver::ItemState>& 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); @@ -68,21 +78,23 @@ void UpdateItemStatesThread::run() bool UpdateItemStatesThread::beginReadItemStates() { - return m_mutex->tryLock(300); + return m_itemMutex.tryLock(300); } void UpdateItemStatesThread::endReadItemStates() { - m_mutex->unlock(); + m_itemMutex.unlock(); } QList<VersionControlObserver::ItemState> UpdateItemStatesThread::itemStates() const { + QMutexLocker locker(&m_itemMutex); return m_itemStates; } bool UpdateItemStatesThread::retrievedItems() const { + QMutexLocker locker(&m_itemMutex); return m_retrievedItems; } |
