4#ifndef QORDEREDMUTEXLOCKER_P_H
5#define QORDEREDMUTEXLOCKER_P_H
18#include <QtCore/private/qglobal_p.h>
19#include <QtCore/qmutex.h>
28
29
30
31class QOrderedMutexLocker
35 QOrderedMutexLocker(QBasicMutex *m1, QBasicMutex *m2)
36 : mtx1((m1 == m2) ? m1 : (std::less<QBasicMutex *>()(m1, m2) ? m1 : m2)),
37 mtx2((m1 == m2) ?
nullptr : (std::less<QBasicMutex *>()(m1, m2) ? m2 : m1)),
43 Q_DISABLE_COPY(QOrderedMutexLocker)
45 void swap(QOrderedMutexLocker &other)
noexcept
47 qSwap(
this->mtx1, other.mtx1);
48 qSwap(
this->mtx2, other.mtx2);
49 qSwap(
this->locked, other.locked);
52 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QOrderedMutexLocker)
55 QOrderedMutexLocker(QOrderedMutexLocker &&other)
noexcept
56 : mtx1(std::exchange(other.mtx1,
nullptr))
57 , mtx2(std::exchange(other.mtx2,
nullptr))
58 , locked(std::exchange(other.locked,
false))
61 ~QOrderedMutexLocker()
69 if (mtx1) mtx1->lock();
70 if (mtx2) mtx2->lock();
76
77
78
79
80
81
82
83
93 if (mtx2) mtx2->unlock();
94 if (mtx1) mtx1->unlock();
99 static bool relock(QBasicMutex *mtx1, QBasicMutex *mtx2)
104 if (std::less<QBasicMutex *>()(mtx1, mtx2)) {
108 if (!mtx2->tryLock()) {
117 QBasicMutex *mtx1, *mtx2;
123class QOrderedMutexLocker
126 Q_DISABLE_COPY(QOrderedMutexLocker)
128 QOrderedMutexLocker(QBasicMutex *, QBasicMutex *) {}
130 QOrderedMutexLocker(QOrderedMutexLocker &&) =
default;
131 QOrderedMutexLocker& operator=(QOrderedMutexLocker &&other) =
default;
132 ~QOrderedMutexLocker() {}
138 static bool relock(QBasicMutex *, QBasicMutex *) {
return false; }