X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/caf017c2fefa8280046b02cfd071a118f2909ced..c06e0666343722e272fcb9268359852bd460cdee:/src/versioncontrol/versioncontrolobserver.cpp diff --git a/src/versioncontrol/versioncontrolobserver.cpp b/src/versioncontrol/versioncontrolobserver.cpp index f47f47484..c1ef4b54b 100644 --- a/src/versioncontrol/versioncontrolobserver.cpp +++ b/src/versioncontrol/versioncontrolobserver.cpp @@ -28,6 +28,7 @@ #include #include +#include "pendingthreadsmaintainer.h" #include "updateitemstatesthread.h" #include @@ -35,18 +36,6 @@ #include #include -/* - * Maintains a list of pending threads, that get regulary checked - * whether they are finished and hence can get deleted. QThread::wait() - * is never used to prevent any blocking of the user interface. - */ -struct PendingThreadsSingleton -{ - QList list; -}; -K_GLOBAL_STATIC(PendingThreadsSingleton, s_pendingThreads) - - VersionControlObserver::VersionControlObserver(QAbstractItemView* view) : QObject(view), m_pendingItemStatesUpdate(false), @@ -92,28 +81,27 @@ VersionControlObserver::~VersionControlObserver() } else { // The version controller gets deleted, while a thread still // is working to get the version information. To avoid a blocking - // user interface, no waiting for the finished() signal of the thread is - // done. Instead the thread will be remembered inside the global - // list s_pendingThreads, which will checked regulary. The thread does - // not work on shared data that is part of the VersionController instance, - // so skipping the waiting is save. + // user interface, the thread will be forwarded to the + // PendingThreadsMaintainer, which will delete the thread later. disconnect(m_updateItemStatesThread, SIGNAL(finished()), this, SLOT(slotThreadFinished())); - s_pendingThreads->list.append(m_updateItemStatesThread); + PendingThreadsMaintainer::instance().append(m_updateItemStatesThread); m_updateItemStatesThread = 0; } } - m_plugin->disconnect(); - m_plugin = 0; + if (m_plugin != 0) { + m_plugin->disconnect(); + m_plugin = 0; + } } QList VersionControlObserver::contextMenuActions(const KFileItemList& items) const { QList actions; - if (isVersioned() && m_updateItemStatesThread->beginReadItemStates()) { + if (isVersioned() && m_updateItemStatesThread->lockPlugin()) { actions = m_plugin->contextMenuActions(items); - m_updateItemStatesThread->endReadItemStates(); + m_updateItemStatesThread->unlockPlugin(); } return actions; } @@ -121,9 +109,9 @@ QList VersionControlObserver::contextMenuActions(const KFileItemList& QList VersionControlObserver::contextMenuActions(const QString& directory) const { QList actions; - if (isVersioned() && m_updateItemStatesThread->beginReadItemStates()) { + if (isVersioned() && m_updateItemStatesThread->lockPlugin()) { actions = m_plugin->contextMenuActions(directory); - m_updateItemStatesThread->endReadItemStates(); + m_updateItemStatesThread->unlockPlugin(); } return actions; @@ -143,19 +131,6 @@ void VersionControlObserver::silentDirectoryVerification() void VersionControlObserver::verifyDirectory() { - if (!s_pendingThreads->list.isEmpty()) { - // Try to cleanup pending threads (see explanation in destructor) - QList::iterator it = s_pendingThreads->list.begin(); - while (it != s_pendingThreads->list.end()) { - if ((*it)->isFinished()) { - (*it)->deleteLater(); - it = s_pendingThreads->list.erase(it); - } else { - ++it; - } - } - } - KUrl versionControlUrl = m_dirLister->url(); if (!versionControlUrl.isLocalFile()) { return;