Occasional deadlock in ConptyConnection dtor when a process exits too quickly #10279

Open
opened 2026-01-31 02:17:08 +00:00 by claunia · 0 comments
Owner

Originally created by @DHowett on GitHub (Aug 25, 2020).

Seen in the wild. The output thread (last owning reference to ConptyConnection) is tearing down and the ConptyConnection dtor tries to tear down our threadpool wait. The threadpool, however, is waiting for the output thread to drain and complete. Whoops.

Stack traces (partial)

tp teardown

01 0000008a`9b7ff980 00007ff8`d99dd836     KERNELBASE!WaitForSingleObjectEx+0x8e 
02 0000008a`9b7ffa20 00007ff9`52e8aa92     TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::_ClientTerminated+0xc6 [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 318] 

output thread

06 0000008a`9c54f510 00007ff8`d99dab68     TerminalConnection!wil::details::DestroyThreadPoolWait<0>::Destroy+0x22 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 2375] 
07 (Inline Function) --------`--------     TerminalConnection!wistd::__invoke+0x5 [E:\BA\139\s\dep\wil\include\wil\wistd_type_traits.h @ 4012] 
08 (Inline Function) --------`--------     TerminalConnection!wistd::invoke+0x5 [E:\BA\139\s\dep\wil\include\wil\wistd_functional.h @ 531] 
09 (Inline Function) --------`--------     TerminalConnection!wil::details::resource_policy<_TP_WAIT *,void (__cdecl*)(_TP_WAIT *),&wil::details::DestroyThreadPoolWait<0>::Destroy,wistd::integral_constant<unsigned __int64,0>,_TP_WAIT *,_TP_WAIT *,0,std::nullptr_t>::close+0x5 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 132] 
0a (Inline Function) --------`--------     TerminalConnection!wil::details::unique_storage<wil::details::resource_policy<_TP_WAIT *,void (__cdecl*)(_TP_WAIT *),&wil::details::DestroyThreadPoolWait<0>::Destroy,wistd::integral_constant<unsigned __int64,0>,_TP_WAIT *,_TP_WAIT *,0,std::nullptr_t> >::{dtor}+0x16 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 176] 
0b 0000008a`9c54f540 00007ff8`d99daa54     TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::~ConptyConnection+0xe8
0c 0000008a`9c54f580 00007ff8`d99b57f0     TerminalConnection!winrt::impl::heap_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::`scalar deleting destructor'+0x14
0d (Inline Function) --------`--------     TerminalConnection!winrt::impl::root_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::NonDelegatingRelease+0x76 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 7058] 
0e (Inline Function) --------`--------     TerminalConnection!winrt::impl::root_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::Release+0x76 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 6930] 
0f 0000008a`9c54f5b0 00007ff8`d99dddd5     TerminalConnection!winrt::implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::Release+0x80 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 7504] 
10 (Inline Function) --------`--------     TerminalConnection!winrt::com_ptr<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::release_ref+0x10 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 2447] 
11 (Inline Function) --------`--------     TerminalConnection!winrt::com_ptr<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::{dtor}+0x10 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 2288] 
12 0000008a`9c54f5e0 00007ff8`d99dd50e     TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::_OutputThread+0x345 [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 452] 
13 (Inline Function) --------`--------     TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::Start::__l3::<lambda_223e35fa14b6c169171518cd8f8b0eba>::operator()+0xa [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 241] 
14 0000008a`9c54f740 00007ff9`518330f4     TerminalConnection!<lambda_223e35fa14b6c169171518cd8f8b0eba>::<lambda_invoker_cdecl>+0xe [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 244] 
Originally created by @DHowett on GitHub (Aug 25, 2020). Seen in the wild. The output thread (last owning reference to `ConptyConnection`) is tearing down and the `ConptyConnection` dtor tries to tear down our threadpool wait. The threadpool, however, is waiting for the output thread to drain and complete. Whoops. Stack traces (partial) ### tp teardown ``` 01 0000008a`9b7ff980 00007ff8`d99dd836 KERNELBASE!WaitForSingleObjectEx+0x8e 02 0000008a`9b7ffa20 00007ff9`52e8aa92 TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::_ClientTerminated+0xc6 [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 318] ``` ### output thread ``` 06 0000008a`9c54f510 00007ff8`d99dab68 TerminalConnection!wil::details::DestroyThreadPoolWait<0>::Destroy+0x22 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 2375] 07 (Inline Function) --------`-------- TerminalConnection!wistd::__invoke+0x5 [E:\BA\139\s\dep\wil\include\wil\wistd_type_traits.h @ 4012] 08 (Inline Function) --------`-------- TerminalConnection!wistd::invoke+0x5 [E:\BA\139\s\dep\wil\include\wil\wistd_functional.h @ 531] 09 (Inline Function) --------`-------- TerminalConnection!wil::details::resource_policy<_TP_WAIT *,void (__cdecl*)(_TP_WAIT *),&wil::details::DestroyThreadPoolWait<0>::Destroy,wistd::integral_constant<unsigned __int64,0>,_TP_WAIT *,_TP_WAIT *,0,std::nullptr_t>::close+0x5 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 132] 0a (Inline Function) --------`-------- TerminalConnection!wil::details::unique_storage<wil::details::resource_policy<_TP_WAIT *,void (__cdecl*)(_TP_WAIT *),&wil::details::DestroyThreadPoolWait<0>::Destroy,wistd::integral_constant<unsigned __int64,0>,_TP_WAIT *,_TP_WAIT *,0,std::nullptr_t> >::{dtor}+0x16 [E:\BA\139\s\dep\wil\include\wil\resource.h @ 176] 0b 0000008a`9c54f540 00007ff8`d99daa54 TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::~ConptyConnection+0xe8 0c 0000008a`9c54f580 00007ff8`d99b57f0 TerminalConnection!winrt::impl::heap_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::`scalar deleting destructor'+0x14 0d (Inline Function) --------`-------- TerminalConnection!winrt::impl::root_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::NonDelegatingRelease+0x76 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 7058] 0e (Inline Function) --------`-------- TerminalConnection!winrt::impl::root_implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::Release+0x76 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 6930] 0f 0000008a`9c54f5b0 00007ff8`d99dddd5 TerminalConnection!winrt::implements<winrt::Microsoft::Terminal::TerminalConnection::implementation::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::AzureConnection,winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection>::Release+0x80 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 7504] 10 (Inline Function) --------`-------- TerminalConnection!winrt::com_ptr<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::release_ref+0x10 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 2447] 11 (Inline Function) --------`-------- TerminalConnection!winrt::com_ptr<winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection>::{dtor}+0x10 [E:\BA\139\s\src\cascadia\TerminalConnection\Generated Files\winrt\base.h @ 2288] 12 0000008a`9c54f5e0 00007ff8`d99dd50e TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::_OutputThread+0x345 [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 452] 13 (Inline Function) --------`-------- TerminalConnection!winrt::Microsoft::Terminal::TerminalConnection::implementation::ConptyConnection::Start::__l3::<lambda_223e35fa14b6c169171518cd8f8b0eba>::operator()+0xa [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 241] 14 0000008a`9c54f740 00007ff9`518330f4 TerminalConnection!<lambda_223e35fa14b6c169171518cd8f8b0eba>::<lambda_invoker_cdecl>+0xe [E:\BA\139\s\src\cascadia\TerminalConnection\ConptyConnection.cpp @ 244] ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#10279