summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-04-02 21:46:41 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-04-07 16:32:07 +0800
commit2b97b774663b44c86eb3f8029d690bbe9a433ec8 (patch)
tree236d5351193a5aedb953429b6719d1e3967bf8df /src
parentc356b3f6dec8a9175c0cc388ed5fd44e7fd17824 (diff)
fix: nullptr(SEGEV) during shutdown
Diffstat (limited to 'src')
-rw-r--r--src/chatServer.cpp8
-rw-r--r--src/renderManager.cpp18
-rw-r--r--src/sessionManager.cpp7
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");