Compare commits

...

1 Commits

Author SHA1 Message Date
Leonard Hecker
a95f55fb77 Fix shutdown woes with TerminateProcess 2024-01-23 14:54:47 +01:00
4 changed files with 11 additions and 36 deletions

View File

@@ -166,7 +166,8 @@ void AppHost::_HandleCommandlineArgs(const Remoting::WindowRequestedArgs& window
if (_windowLogic.ShouldExitEarly())
{
ExitThread(result);
TerminateProcess(GetCurrentProcess(), gsl::narrow_cast<UINT>(result));
__assume(false);
}
}
}

View File

@@ -38,20 +38,6 @@ WindowEmperor::WindowEmperor() noexcept :
});
_dispatcher = winrt::Windows::System::DispatcherQueue::GetForCurrentThread();
// BODGY
//
// There's a mysterious crash in XAML on Windows 10 if you just let the App
// get dtor'd. By all accounts, it doesn't make sense. To mitigate this, we
// need to intentionally leak a reference to our App. Crazily, if you just
// let the app get cleaned up with the rest of the process when the process
// exits, then it doesn't crash. But if you let it get explicitly dtor'd, it
// absolutely will crash on exit.
//
// GH#15410 has more details.
auto a{ _app };
::winrt::detach_abi(a);
}
WindowEmperor::~WindowEmperor()
@@ -82,7 +68,7 @@ void _buildArgsFromCommandline(std::vector<winrt::hstring>& args)
}
}
bool WindowEmperor::HandleCommandlineArgs()
void WindowEmperor::HandleCommandlineArgs()
{
std::vector<winrt::hstring> args;
_buildArgsFromCommandline(args);
@@ -111,15 +97,14 @@ bool WindowEmperor::HandleCommandlineArgs()
Remoting::CommandlineArgs eventArgs{ { args }, { cwd }, showWindow, winrt::hstring{ currentEnv.to_string() } };
const auto isolatedMode{ _app.Logic().IsolatedMode() };
const auto result = _manager.ProposeCommandline(eventArgs, isolatedMode);
int exitCode = 0;
const bool makeWindow = result.ShouldCreateWindow();
if (makeWindow)
if (result.ShouldCreateWindow())
{
_createNewWindowThread(Remoting::WindowRequestedArgs{ result, eventArgs });
_becomeMonarch();
WaitForWindows();
}
else
{
@@ -127,11 +112,12 @@ bool WindowEmperor::HandleCommandlineArgs()
if (!res.Message.empty())
{
AppHost::s_DisplayMessageBox(res);
std::quick_exit(res.ExitCode);
}
exitCode = res.ExitCode;
}
return makeWindow;
TerminateProcess(GetCurrentProcess(), gsl::narrow_cast<UINT>(exitCode));
__assume(false);
}
void WindowEmperor::WaitForWindows()
@@ -584,15 +570,6 @@ LRESULT WindowEmperor::_messageHandler(UINT const message, WPARAM const wParam,
// we'll undoubtedly crash.
winrt::fire_and_forget WindowEmperor::_close()
{
{
auto fridge{ _oldThreads.lock() };
for (auto& window : *fridge)
{
window->ThrowAway();
}
fridge->clear();
}
// Important! Switch back to the main thread for the emperor. That way, the
// quit will go to the emperor's message pump.
co_await wil::resume_foreground(_dispatcher);

View File

@@ -27,7 +27,7 @@ public:
~WindowEmperor();
void WaitForWindows();
bool HandleCommandlineArgs();
void HandleCommandlineArgs();
private:
void _createNewWindowThread(const winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs& args);

View File

@@ -115,8 +115,5 @@ int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
winrt::init_apartment(winrt::apartment_type::single_threaded);
const auto emperor = std::make_shared<::WindowEmperor>();
if (emperor->HandleCommandlineArgs())
{
emperor->WaitForWindows();
}
emperor->HandleCommandlineArgs();
}