5#ifndef QORDEREDMUTEXLOCKER_P_H
6#define QORDEREDMUTEXLOCKER_P_H
19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qmutex.h>
29
30
31
32class QOrderedMutexLocker
36 QOrderedMutexLocker(QBasicMutex *m1, QBasicMutex *m2)
37 : mtx1((m1 == m2) ? m1 : (std::less<QBasicMutex *>()(m1, m2) ? m1 : m2)),
38 mtx2((m1 == m2) ?
nullptr : (std::less<QBasicMutex *>()(m1, m2) ? m2 : m1)),
44 Q_DISABLE_COPY(QOrderedMutexLocker)
46 void swap(QOrderedMutexLocker &other)
noexcept
48 qSwap(
this->mtx1, other.mtx1);
49 qSwap(
this->mtx2, other.mtx2);
50 qSwap(
this->locked, other.locked);
53 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QOrderedMutexLocker)
56 QOrderedMutexLocker(QOrderedMutexLocker &&other)
noexcept
57 : mtx1(std::exchange(other.mtx1,
nullptr))
58 , mtx2(std::exchange(other.mtx2,
nullptr))
59 , locked(std::exchange(other.locked,
false))
62 ~QOrderedMutexLocker()
70 if (mtx1) mtx1->lock();
71 if (mtx2) mtx2->lock();
77
78
79
80
81
82
83
84
94 if (mtx2) mtx2->unlock();
95 if (mtx1) mtx1->unlock();
100 static bool relock(QBasicMutex *mtx1, QBasicMutex *mtx2)
105 if (std::less<QBasicMutex *>()(mtx1, mtx2)) {
109 if (!mtx2->tryLock()) {
118 QBasicMutex *mtx1, *mtx2;
124class QOrderedMutexLocker
127 Q_DISABLE_COPY(QOrderedMutexLocker)
129 QOrderedMutexLocker(QBasicMutex *, QBasicMutex *) {}
131 QOrderedMutexLocker(QOrderedMutexLocker &&) =
default;
132 QOrderedMutexLocker& operator=(QOrderedMutexLocker &&other) =
default;
133 ~QOrderedMutexLocker() {}
139 static bool relock(QBasicMutex *, QBasicMutex *) {
return false; }