From f7c182585b32e4fbfae7cf26e91eb193216828ec Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 11 Mar 2025 09:30:16 +0800 Subject: signal(session,sessionManager): atexit handler sometimes have malloc: Heap corruption detected :/ --- src/session.cpp | 5 +++++ src/session.hpp | 1 + src/sessionManager.cpp | 8 ++++++++ src/sessionManager.hpp | 1 + 4 files changed, 15 insertions(+) (limited to 'src') diff --git a/src/session.cpp b/src/session.cpp index f8506c2..a6875b0 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -144,3 +144,8 @@ std::string CSession::getName() { void CSession::setSelf(std::pair> *self) { this->self = self; } + +void CSession::onShutdown() { + write(SYS, "Shutting down, bye"); + g_pSessionManager->removeSession(self); +} diff --git a/src/session.hpp b/src/session.hpp index d32fd96..6f1382c 100644 --- a/src/session.hpp +++ b/src/session.hpp @@ -42,5 +42,6 @@ class CSession { void onErrno(eEventType); void onRecv(const SRecvData &data); void onSend(const std::string &msg); + void onShutdown(); friend class CSessionManager; }; diff --git a/src/sessionManager.cpp b/src/sessionManager.cpp index f4573e1..b4e1ad5 100644 --- a/src/sessionManager.cpp +++ b/src/sessionManager.cpp @@ -6,7 +6,15 @@ #include #include "log.hpp" +void CSessionManager::shutdownSessions() { + for (const auto &[thread, session] : m_vSessions) + session->onShutdown(); +} + CSessionManager::CSessionManager() { + if (std::atexit([]() { g_pSessionManager->shutdownSessions(); })) + log(ERR, "Failed to register SessionManager atexit handler, will fallback to quick_exit after hang"); + log(LOG, "SessionManager: initialized"); }; diff --git a/src/sessionManager.hpp b/src/sessionManager.hpp index 08ba541..8f2130a 100644 --- a/src/sessionManager.hpp +++ b/src/sessionManager.hpp @@ -20,6 +20,7 @@ class CSessionManager { void removeSession(std::pair> *session); bool nameExists(const std::string &name); + void shutdownSessions(); private: void broadcastChat(const std::string &msg, const std::string &username) const; -- cgit v1.2.3