diff options
| author | Simeon Bird <[email protected]> | 2012-10-19 21:04:55 -0400 |
|---|---|---|
| committer | Simeon Bird <[email protected]> | 2012-10-19 21:05:54 -0400 |
| commit | 4f6a2780eecca9b46a3ceac35c7bfe0c0ce502e4 (patch) | |
| tree | 81d7e48dcc7890e8b067d346dc7d7270f142344e /src | |
| parent | 1c6d0c316a1979728e404ac22cbeae6339a5cc0b (diff) | |
Fix race condition and deadlock in the version plugin
when listing directories is slow.
BUG: 302264
FIXED-IN: 4.9.3
Diffstat (limited to 'src')
| -rw-r--r-- | src/views/versioncontrol/updateitemstatesthread.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index f9746aadd..e07d72c76 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -45,10 +45,12 @@ UpdateItemStatesThread::~UpdateItemStatesThread() void UpdateItemStatesThread::setData(KVersionControlPlugin* plugin, const QList<VersionControlObserver::ItemState>& 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; } @@ -58,11 +60,12 @@ void UpdateItemStatesThread::run() Q_ASSERT(m_plugin); QMutexLocker itemLocker(&m_itemMutex); + 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(); |
