diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/chatServer.cpp | 8 | ||||
| -rw-r--r-- | src/renderManager.cpp | 18 | ||||
| -rw-r--r-- | src/sessionManager.cpp | 7 |
3 files changed, 25 insertions, 8 deletions
diff --git a/src/chatServer.cpp b/src/chatServer.cpp index 7c92721..5c60107 100644 --- a/src/chatServer.cpp +++ b/src/chatServer.cpp @@ -23,10 +23,12 @@ CChatServer::~CChatServer() { } void CChatServer::cleanup() { + if (g_pSessionManager) { + g_pSessionManager->shutdownSessions(); + g_pSessionManager.reset(); + } + g_pChatManager.reset(); - // if (m_sessionManagerThread.joinable()) - // m_sessionManagerThread.join(); - g_pSessionManager.reset(); g_pServer.reset(); g_pCommandHandler.reset(); g_pInputManager.reset(); diff --git a/src/renderManager.cpp b/src/renderManager.cpp index c103285..84896a1 100644 --- a/src/renderManager.cpp +++ b/src/renderManager.cpp @@ -3,8 +3,10 @@ CRenderManager::CRenderManager() : screen(ftxui::ScreenInteractive::TerminalOutput()) { - if (std::atexit([]() { g_pRenderManager->exitLoop(); })) - log(ERR, "Failed to register SessionManager atexit handler, will fallback to quick_exit after hang"); + if (std::atexit([]() { + if (g_pRenderManager) g_pRenderManager->exitLoop(); + })) + log(ERR, "Failed to register RenderManager atexit handler, will fallback to quick_exit after hang"); log(LOG, "RenderManager: initialized"); }; @@ -14,8 +16,16 @@ CRenderManager::~CRenderManager() { } void CRenderManager::exitLoop() { - screen.ExitLoopClosure()(); - screen.Exit(); + if (renderer) { + try { + screen.ExitLoopClosure()(); + screen.Exit(); + } catch (const std::exception& e) { + log(WARN, "Exception in exitLoop: {}", e.what()); + } catch (...) { + log(WARN, "Unknown exception in exitLoop"); + } + } } void CRenderManager::enterLoop() { diff --git a/src/sessionManager.cpp b/src/sessionManager.cpp index d880640..49d65b1 100644 --- a/src/sessionManager.cpp +++ b/src/sessionManager.cpp @@ -8,12 +8,17 @@ #include <utility> void CSessionManager::shutdownSessions() { + if (m_vSessions.empty()) + return; + for (auto &session : m_vSessions) kick(&session, false, "Server shutting down"); } CSessionManager::CSessionManager() { - if (std::atexit([]() { g_pSessionManager->shutdownSessions(); })) + if (std::atexit([]() { + if (g_pSessionManager) g_pSessionManager->shutdownSessions(); + })) log(ERR, "Failed to register SessionManager atexit handler, will fallback to quick_exit after hang"); log(LOG, "SessionManager: initialized"); |
