diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 19dbeae2c50..7378b71de54 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -641,27 +641,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation { Close(); - // Before destroying this instance we must ensure that we destroy the _renderer - // before the _renderEngine, as well as calling _renderer->TriggerTeardown(). - // _renderEngine will be destroyed naturally after this ~destructor() returns. - - decltype(_renderer) renderer; - { - // GH#8734: - // We lock the terminal here to make sure it isn't still being - // used in the connection thread before we destroy the renderer. - // However, we must unlock it again prior to triggering the - // teardown, to avoid the render thread being deadlocked. The - // renderer may be waiting to acquire the terminal lock, while - // we're waiting for the renderer to finish. - auto lock = _terminal->LockForWriting(); - - _renderer.swap(renderer); - } - - if (renderer) + if (_renderer) { - renderer->TriggerTeardown(); + _renderer->TriggerTeardown(); } } diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index f38d8592eeb..bd4d69b0498 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -130,9 +130,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation std::unique_ptr<::Microsoft::Terminal::Core::Terminal> _terminal; - std::unique_ptr<::Microsoft::Console::Render::Renderer> _renderer; + // NOTE: All render engines must be ordered before _renderer. + // + // As _renderer has a dependency on the render engine (through a raw pointer) + // we must ensure the _renderer is deallocated first. + // (C++ class members are destroyed in reverse order.) std::unique_ptr<::Microsoft::Console::Render::DxEngine> _renderEngine; std::unique_ptr<::Microsoft::Console::Render::UiaEngine> _uiaEngine; + std::unique_ptr<::Microsoft::Console::Render::Renderer> _renderer; IControlSettings _settings; bool _focused;