summaryrefslogtreecommitdiff
path: root/src/server/clients.cpp
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-19 18:45:34 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-19 18:45:34 +0800
commitcad2569f10e6c0131e5e645ee76330c776b91547 (patch)
treef246b6a9799644c735228c6c5df2ece65e0d028d /src/server/clients.cpp
parentb3a3e73aaefa39e052e53f9f42c6d0e2f7e1bb9b (diff)
fix!: share pointer
for details: https://stackoverflow.com/a/5548314
Diffstat (limited to 'src/server/clients.cpp')
-rw-r--r--src/server/clients.cpp27
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