fix: stop portal input capture thread on server exit
Server aborted with "pure virtual method called" when the bind address was in use: EiScreen's PortalInputCapture glib thread outlived Arch and hit its freed vtable. ~EiScreen never deleted m_portalInputCapture, and a fatal startup threw past cleanupServer(). Fix both.
This commit is contained in:
parent
c8231208c1
commit
f0f3428d50
2 changed files with 11 additions and 1 deletions
|
|
@ -516,7 +516,16 @@ int ServerApp::mainLoop()
|
|||
}
|
||||
|
||||
// start server, etc
|
||||
appUtil().startNode();
|
||||
try {
|
||||
appUtil().startNode();
|
||||
} catch (...) {
|
||||
// a fatal startup failure (e.g. the listen address is already in use)
|
||||
// exits by throwing, which unwinds past the cleanup at the end of this
|
||||
// function. tear the server down here so the screen and its worker
|
||||
// threads don't outlive the app and call into freed globals on exit.
|
||||
cleanupServer();
|
||||
throw;
|
||||
}
|
||||
|
||||
// handle hangup signal by reloading the server's configuration
|
||||
ARCH->setSignalHandler(Arch::ThreadSignal::Hangup, &reloadSignalHandler, nullptr);
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ EiScreen::~EiScreen()
|
|||
delete m_clipboard;
|
||||
|
||||
delete m_portalRemoteDesktop;
|
||||
delete m_portalInputCapture;
|
||||
}
|
||||
|
||||
void EiScreen::eiLogEvent(ei_log_priority priority, const char *message) const
|
||||
|
|
|
|||
Loading…
Reference in a new issue