From 26dc21177a2cdf707f6ea70626a5c6cf0b5a8c5d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Dec 2020 23:07:37 -0800 Subject: [PATCH] Qt: Flesh out Interrupter some --- src/platform/qt/CoreController.cpp | 67 +++++++++++++++++++++--------- src/platform/qt/CoreController.h | 10 +++++ 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 32196428f..84bb22ead 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -1096,25 +1096,57 @@ void CoreController::updateROMInfo() { #endif } +CoreController::Interrupter::Interrupter() + : m_parent(nullptr) +{ +} + CoreController::Interrupter::Interrupter(CoreController* parent) : m_parent(parent) { - if (!m_parent->thread()->impl) { - return; - } - if (mCoreThreadGet() != m_parent->thread()) { - mCoreThreadInterrupt(m_parent->thread()); - } else { - mCoreThreadInterruptFromThread(m_parent->thread()); - } + interrupt(); } CoreController::Interrupter::Interrupter(std::shared_ptr parent) : m_parent(parent.get()) { - if (!m_parent->thread()->impl) { + interrupt(); +} + +CoreController::Interrupter::Interrupter(const Interrupter& other) + : m_parent(other.m_parent) +{ + interrupt(); +} + +CoreController::Interrupter::~Interrupter() { + resume(); +} + +CoreController::Interrupter& CoreController::Interrupter::operator=(const Interrupter& other) +{ + interrupt(other.m_parent); + return *this; +} + +void CoreController::Interrupter::interrupt(CoreController* controller) { + if (m_parent != controller) { + CoreController* old = m_parent; + m_parent = controller; + interrupt(); + resume(old); + } +} + +void CoreController::Interrupter::interrupt(std::shared_ptr controller) { + interrupt(controller.get()); +} + +void CoreController::Interrupter::interrupt() { + if (!m_parent || !m_parent->thread()->impl) { return; } + if (mCoreThreadGet() != m_parent->thread()) { mCoreThreadInterrupt(m_parent->thread()); } else { @@ -1122,18 +1154,15 @@ CoreController::Interrupter::Interrupter(std::shared_ptr parent) } } -CoreController::Interrupter::Interrupter(const Interrupter& other) - : m_parent(other.m_parent) -{ - if (!m_parent->thread()->impl) { - return; - } - mCoreThreadInterrupt(m_parent->thread()); +void CoreController::Interrupter::resume() { + resume(m_parent); + m_parent = nullptr; } -CoreController::Interrupter::~Interrupter() { - if (!m_parent->thread()->impl) { +void CoreController::Interrupter::resume(CoreController* controller) { + if (!controller || !controller->thread()->impl) { return; } - mCoreThreadContinue(m_parent->thread()); + + mCoreThreadContinue(controller->thread()); } diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 3903a625d..1f0f052bf 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -53,12 +53,22 @@ public: class Interrupter { public: + Interrupter(); Interrupter(CoreController*); Interrupter(std::shared_ptr); Interrupter(const Interrupter&); ~Interrupter(); + Interrupter& operator=(const Interrupter&); + + void interrupt(CoreController*); + void interrupt(std::shared_ptr); + void resume(); + private: + void interrupt(); + void resume(CoreController*); + CoreController* m_parent; };