Warning, file /graphics/krita/sdk/tests/KisRectsCollisionsTracker.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef KISRECTSCOLLISIONSTRACKER_H 0008 #define KISRECTSCOLLISIONSTRACKER_H 0009 0010 #include <QList> 0011 #include <QRect> 0012 #include <QMutex> 0013 #include <QMutexLocker> 0014 0015 #include "kis_assert.h" 0016 0017 0018 class KisRectsCollisionsTracker 0019 { 0020 public: 0021 0022 void startAccessingRect(const QRect &rc) { 0023 QMutexLocker l(&m_mutex); 0024 0025 checkUniqueAccessImpl(rc, "start"); 0026 m_rectsInProgress.append(rc); 0027 } 0028 0029 void endAccessingRect(const QRect &rc) { 0030 QMutexLocker l(&m_mutex); 0031 const bool result = m_rectsInProgress.removeOne(rc); 0032 KIS_SAFE_ASSERT_RECOVER_NOOP(result); 0033 checkUniqueAccessImpl(rc, "end"); 0034 } 0035 0036 private: 0037 0038 bool checkUniqueAccessImpl(const QRect &rect, const QString &tag) { 0039 0040 Q_FOREACH (const QRect &rc, m_rectsInProgress) { 0041 if (rc != rect && rect.intersects(rc)) { 0042 ENTER_FUNCTION() << "FAIL: concurrent access from" << rect << "to" << rc << tag; 0043 return false; 0044 } 0045 } 0046 0047 return true; 0048 } 0049 0050 private: 0051 QList<QRect> m_rectsInProgress; 0052 QMutex m_mutex; 0053 }; 0054 0055 #endif // KISRECTSCOLLISIONSTRACKER_H