diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-06-19 18:45:34 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-19 18:45:34 +0800 |
| commit | cad2569f10e6c0131e5e645ee76330c776b91547 (patch) | |
| tree | f246b6a9799644c735228c6c5df2ece65e0d028d /src/server/clients.cpp | |
| parent | b3a3e73aaefa39e052e53f9f42c6d0e2f7e1bb9b (diff) | |
fix!: share pointer
for details: https://stackoverflow.com/a/5548314
Diffstat (limited to 'src/server/clients.cpp')
| -rw-r--r-- | src/server/clients.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/server/clients.cpp b/src/server/clients.cpp index c957d92..201ccc6 100644 --- a/src/server/clients.cpp +++ b/src/server/clients.cpp @@ -9,6 +9,9 @@ using namespace LibSock::Server; +namespace LibSock { +namespace Server { + void Clients::shutdownClients(std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>> &)>> cb) { if (m_vClients.empty()) return; @@ -27,14 +30,25 @@ void Clients::shutdownClients(std::optional<std::function<std::any(const std::ve Clients::Clients() { if (std::atexit([]() { - pClients->shutdownClients(); + if (pClients) + pClients->shutdownClients(); })) void(); // failed to register exit handler... +} + +SP<Clients> Clients::create() { if (pClients) - throw std::runtime_error("server:client: ClientManager already exist"); + throw std::runtime_error("server:clients ClientManager already exist"); - pClients = SP<Clients>(this); -}; + pClients = SP<Clients>(new Clients()); + return pClients; +} + +SP<Clients> Clients::get() { + if (!pClients) + pClients = shared_from_this(); + return pClients; +} Clients::~Clients() { for (auto &[thread, client] : m_vClients) { @@ -45,7 +59,7 @@ Clients::~Clients() { } WP<Client> Clients::newClient(std::optional<std::function<std::any(WP<Client>)>> cb) { - SP client = SP<Client>(new Client()); + SP client = SP<Client>(new Client(pServer, shared_from_this())); auto &instance = m_vClients.emplace_back(std::jthread([client]() { client->run(); }), client); instance.second->self = std::weak_ptr<Client>(instance.second); if (cb) @@ -111,3 +125,6 @@ void Clients::kick(WP<Client> clientWeak, const bool kill, const std::string &re } } } + +} // namespace Server +} // namespace LibSock |
