diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index aba4d68de..1ecf6158c 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -849,7 +849,13 @@ WORD Terminal::_TakeVirtualKeyFromLastKeyEvent(const WORD scanCode) noexcept // will release this lock when it's destructed. [[nodiscard]] std::unique_lock Terminal::LockForReading() { +#ifdef NDEBUG return std::unique_lock{ _readWriteLock }; +#else + auto lock = std::unique_lock{ _readWriteLock }; + _lastLocker = GetCurrentThreadId(); + return lock; +#endif } // Method Description: @@ -859,7 +865,13 @@ WORD Terminal::_TakeVirtualKeyFromLastKeyEvent(const WORD scanCode) noexcept // will release this lock when it's destructed. [[nodiscard]] std::unique_lock Terminal::LockForWriting() { +#ifdef NDEBUG return std::unique_lock{ _readWriteLock }; +#else + auto lock = std::unique_lock{ _readWriteLock }; + _lastLocker = GetCurrentThreadId(); + return lock; +#endif } Viewport Terminal::_GetMutableViewport() const noexcept diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 7167273de..6af18677d 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -255,6 +255,9 @@ private: // But we can abuse the fact that the surrounding members rarely change and are huge // (std::function is like 64 bytes) to create some natural padding without wasting space. til::ticket_lock _readWriteLock; +#ifndef NDEBUG + DWORD _lastLocker; +#endif std::function _pfnScrollPositionChanged; std::function _pfnBackgroundColorChanged; diff --git a/src/cascadia/TerminalCore/terminalrenderdata.cpp b/src/cascadia/TerminalCore/terminalrenderdata.cpp index a637f5f38..630df7153 100644 --- a/src/cascadia/TerminalCore/terminalrenderdata.cpp +++ b/src/cascadia/TerminalCore/terminalrenderdata.cpp @@ -233,6 +233,9 @@ catch (...) void Terminal::LockConsole() noexcept { _readWriteLock.lock(); +#ifndef NDEBUG + _lastLocker = GetCurrentThreadId(); +#endif } // Method Description: diff --git a/src/types/TermControlUiaProvider.cpp b/src/types/TermControlUiaProvider.cpp index 3ced07561..edcee5a15 100644 --- a/src/types/TermControlUiaProvider.cpp +++ b/src/types/TermControlUiaProvider.cpp @@ -114,12 +114,6 @@ HRESULT TermControlUiaProvider::GetSelectionRange(_In_ IRawElementProviderSimple RETURN_HR_IF_NULL(E_INVALIDARG, ppUtr); *ppUtr = nullptr; - _pData->LockConsole(); - auto Unlock = wil::scope_exit([&]() noexcept { - _pData->UnlockConsole(); - }); - RETURN_HR_IF(E_FAIL, !_pData->IsUiaDataInitialized() || !_pData->IsSelectionActive()); - const auto start = _pData->GetSelectionAnchor(); // we need to make end exclusive