diff --git a/src/libs/utils/guard.cpp b/src/libs/utils/guard.cpp index b1e220136ee..2f7d56d6c75 100644 --- a/src/libs/utils/guard.cpp +++ b/src/libs/utils/guard.cpp @@ -97,6 +97,17 @@ bool Guard::isLocked() const return m_lockCount; } +void Guard::lock() +{ + ++m_lockCount; +} + +void Guard::unlock() +{ + QTC_CHECK(m_lockCount > 0); + --m_lockCount; +} + GuardLocker::GuardLocker(Guard &guard) : m_guard(guard) { diff --git a/src/libs/utils/guard.h b/src/libs/utils/guard.h index 2f986d82b06..7a0ddbf5c53 100644 --- a/src/libs/utils/guard.h +++ b/src/libs/utils/guard.h @@ -38,6 +38,12 @@ public: Guard(); ~Guard(); bool isLocked() const; + + // Prefer using GuardLocker when possible. These two methods are provided only for cases + // when locking and unlocking are done in separate methods, so that GuardLocker can't be + // used. + void lock(); + void unlock(); private: int m_lockCount = 0; friend class GuardLocker; diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 856905f3abe..d62e26601b1 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -946,23 +946,23 @@ private: void modelAboutToReset() { m_selectedId = m_model->deviceId(m_comboBox->currentIndex()); - m_ignoreChange = true; + m_ignoreChanges.lock(); } void modelReset() { m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId)); - m_ignoreChange = false; + m_ignoreChanges.unlock(); } void currentDeviceChanged() { - if (m_ignoreChange) + if (m_ignoreChanges.isLocked()) return; DeviceKitAspect::setDeviceId(m_kit, m_model->deviceId(m_comboBox->currentIndex())); } - bool m_ignoreChange = false; + Guard m_ignoreChanges; QComboBox *m_comboBox; QWidget *m_manageButton; DeviceManagerModel *m_model; @@ -1218,23 +1218,23 @@ private: void modelAboutToReset() { m_selectedId = m_model->deviceId(m_comboBox->currentIndex()); - m_ignoreChange = true; + m_ignoreChanges.lock(); } void modelReset() { m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId)); - m_ignoreChange = false; + m_ignoreChanges.unlock(); } void currentDeviceChanged() { - if (m_ignoreChange) + if (m_ignoreChanges.isLocked()) return; BuildDeviceKitAspect::setDeviceId(m_kit, m_model->deviceId(m_comboBox->currentIndex())); } - bool m_ignoreChange = false; + Guard m_ignoreChanges; QComboBox *m_comboBox; QWidget *m_manageButton; DeviceManagerModel *m_model;