summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/qchangearbiter.cpp21
-rw-r--r--src/core/qchangearbiter_p.h2
-rw-r--r--src/core/services/qeventfilterservice.cpp29
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;
}