diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/core.cpp | 4 | ||||
-rw-r--r-- | src/core/frontend/emu_window.h | 11 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index b0cfee3ee..c60a784c3 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -326,7 +326,9 @@ struct System::Impl { is_powered_on = false; exit_lock = false; - gpu_core->NotifyShutdown(); + if (gpu_core != nullptr) { + gpu_core->NotifyShutdown(); + } services.reset(); service_manager.reset(); diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index e413a520a..b3bffecb2 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -42,11 +42,20 @@ public: context.MakeCurrent(); } ~Scoped() { - context.DoneCurrent(); + if (active) { + context.DoneCurrent(); + } + } + + /// In the event that context was destroyed before the Scoped is destroyed, this provides a + /// mechanism to prevent calling a destroyed object's method during the deconstructor + void Cancel() { + active = false; } private: GraphicsContext& context; + bool active{true}; }; /// Calls MakeCurrent on the context and calls DoneCurrent when the scope for the returned value |