From 884e95cc985ccf3a7d9de9ebe0d9b1bbd2d9e706 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Wed, 24 Mar 2010 22:21:09 +0000 Subject: Version control: Move the maintainance of pending threads into a custom class. Also the UpdateItemStatesThread differs now between protecting the globally shared plugin and the locally shared data. svn path=/trunk/KDE/kdebase/apps/; revision=1107125 --- src/versioncontrol/updateitemstatesthread.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/versioncontrol/updateitemstatesthread.cpp') 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 + 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); @@ -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 UpdateItemStatesThread::itemStates() const { + QMutexLocker locker(&m_itemMutex); return m_itemStates; } bool UpdateItemStatesThread::retrievedItems() const { + QMutexLocker locker(&m_itemMutex); return m_retrievedItems; } -- cgit v1.3