diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/qchangearbiter.cpp | 21 | ||||
-rw-r--r-- | src/core/qchangearbiter_p.h | 2 | ||||
-rw-r--r-- | src/core/services/qeventfilterservice.cpp | 29 |
3 files changed, 24 insertions, 28 deletions
diff --git a/src/core/qchangearbiter.cpp b/src/core/qchangearbiter.cpp index e0ee389c4..8cfc4b066 100644 --- a/src/core/qchangearbiter.cpp +++ b/src/core/qchangearbiter.cpp @@ -51,6 +51,8 @@ #include <Qt3DCore/private/qscene_p.h> #include <Qt3DCore/private/qsceneobserverinterface_p.h> +#include <mutex> + QT_BEGIN_NAMESPACE namespace Qt3DCore { @@ -76,7 +78,6 @@ namespace Qt3DCore { */ QChangeArbiter::QChangeArbiter(QObject *parent) : QObject(parent) - , m_mutex(QMutex::Recursive) , m_jobManager(nullptr) , m_postman(nullptr) , m_scene(nullptr) @@ -151,31 +152,31 @@ QThreadStorage<QChangeArbiter::QChangeQueue *> *QChangeArbiter::tlsChangeQueue() void QChangeArbiter::appendChangeQueue(QChangeArbiter::QChangeQueue *queue) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; m_changeQueues.append(queue); } void QChangeArbiter::removeChangeQueue(QChangeArbiter::QChangeQueue *queue) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; m_changeQueues.removeOne(queue); } void QChangeArbiter::appendLockingChangeQueue(QChangeArbiter::QChangeQueue *queue) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; m_lockingChangeQueues.append(queue); } void QChangeArbiter::removeLockingChangeQueue(QChangeArbiter::QChangeQueue *queue) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; m_lockingChangeQueues.removeOne(queue); } void QChangeArbiter::syncChanges() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; for (QChangeArbiter::QChangeQueue *changeQueue : qAsConst(m_changeQueues)) distributeQueueChanges(changeQueue); @@ -202,7 +203,7 @@ void QChangeArbiter::registerObserver(QObserverInterface *observer, QNodeId nodeId, ChangeFlags changeFlags) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; QObserverList &observerList = m_nodeObservations[nodeId]; observerList.append(QObserverPair(changeFlags, observer)); } @@ -216,7 +217,7 @@ void QChangeArbiter::registerSceneObserver(QSceneObserverInterface *observer) void QChangeArbiter::unregisterObserver(QObserverInterface *observer, QNodeId nodeId) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; const auto it = m_nodeObservations.find(nodeId); if (it != m_nodeObservations.end()) { QObserverList &observers = it.value(); @@ -251,13 +252,13 @@ void QChangeArbiter::sceneChangeEvent(const QSceneChangePtr &e) void QChangeArbiter::sceneChangeEventWithLock(const QSceneChangePtr &e) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; sceneChangeEvent(e); } void QChangeArbiter::sceneChangeEventWithLock(const QSceneChangeList &e) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex);; QChangeQueue *localChangeQueue = m_tlsChangeQueue.localData(); qCDebug(ChangeArbiter) << Q_FUNC_INFO << "Handles " << e.size() << " changes at once"; localChangeQueue->insert(localChangeQueue->end(), e.begin(), e.end()); diff --git a/src/core/qchangearbiter_p.h b/src/core/qchangearbiter_p.h index ac52273ea..1f453ff56 100644 --- a/src/core/qchangearbiter_p.h +++ b/src/core/qchangearbiter_p.h @@ -137,7 +137,7 @@ protected: void removeLockingChangeQueue(QChangeQueue *queue); private: - mutable QMutex m_mutex; + mutable QRecursiveMutex m_mutex; QAbstractAspectJobManager *m_jobManager; // The lists of observers indexed by observable (QNodeId). diff --git a/src/core/services/qeventfilterservice.cpp b/src/core/services/qeventfilterservice.cpp index c4ec79a13..036bcd7b4 100644 --- a/src/core/services/qeventfilterservice.cpp +++ b/src/core/services/qeventfilterservice.cpp @@ -39,12 +39,13 @@ #include "qeventfilterservice_p.h" -#include <QtCore/QMap> #include <QtCore/QObject> -#include <QtCore/QVector> #include <Qt3DCore/private/qabstractserviceprovider_p.h> +#include <algorithm> +#include <vector> + QT_BEGIN_NAMESPACE namespace { @@ -54,10 +55,10 @@ namespace { int priority; }; - bool operator <(const FilterPriorityPair &a, const FilterPriorityPair &b) + const auto byPriority = [](const FilterPriorityPair &a, const FilterPriorityPair &b) noexcept { return a.priority < b.priority; - } + }; } Q_DECLARE_TYPEINFO(FilterPriorityPair, Q_PRIMITIVE_TYPE); @@ -89,32 +90,26 @@ public: void registerEventFilter(QObject *eventFilter, int priority) { - for (int i = 0, m = m_eventFilters.size(); i < m; ++i) - if (m_eventFilters.at(i).priority == priority) - return; - FilterPriorityPair fpPair; fpPair.filter = eventFilter; fpPair.priority = priority; - m_eventFilters.push_back(fpPair); - std::sort(m_eventFilters.begin(), m_eventFilters.end()); + const auto it = std::lower_bound(m_eventFilters.begin(), m_eventFilters.end(), fpPair, byPriority); + if (it == m_eventFilters.end() || it->priority != priority) + m_eventFilters.insert(it, std::move(fpPair)); } void unregisterEventFilter(QObject *eventFilter) { - QVector<FilterPriorityPair>::iterator it = m_eventFilters.begin(); - const QVector<FilterPriorityPair>::iterator end = m_eventFilters.end(); - while (it != end) { + for (auto it = m_eventFilters.begin(), end = m_eventFilters.end(); it != end; ++it) { if (it->filter == eventFilter) { m_eventFilters.erase(it); return; } - ++it; } } QScopedPointer<InternalEventListener> m_eventDispatcher; - QVector<FilterPriorityPair> m_eventFilters; + std::vector<FilterPriorityPair> m_eventFilters; }; /* !\internal @@ -179,8 +174,8 @@ InternalEventListener::InternalEventListener(QEventFilterServicePrivate *filterS bool InternalEventListener::eventFilter(QObject *obj, QEvent *e) { - for (int i = m_filterService->m_eventFilters.size() - 1; i >= 0; --i) { - const FilterPriorityPair &fPPair = m_filterService->m_eventFilters.at(i); + for (auto i = m_filterService->m_eventFilters.size(); i > 0; --i) { + const FilterPriorityPair &fPPair = m_filterService->m_eventFilters[i - 1]; if (fPPair.filter->eventFilter(obj, e)) return true; } |