From 0028a4673d092e0dc8c57cce75cb158ad09826de Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sun, 22 Jun 2025 17:31:09 +0800 Subject: API(server/clients:create): optional wait argument making ClientManager wait for client thread to finish --- include/libsock/server/clients.hpp | 6 ++++-- src/server/clients.cpp | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/libsock/server/clients.hpp b/include/libsock/server/clients.hpp index cb11e74..dbe7099 100644 --- a/include/libsock/server/clients.hpp +++ b/include/libsock/server/clients.hpp @@ -21,7 +21,7 @@ struct SData { class Clients : public std::enable_shared_from_this { public: - static SP create(WP server); + static SP create(WP server, bool wait = false); ~Clients(); SP newClient(std::function &)> cb = [](SP) {}); @@ -38,11 +38,13 @@ class Clients : public std::enable_shared_from_this { std::vector getDatas() const; private: - Clients(); + Clients(bool wait = false); + void broadcast(const SData &msg); std::vector>> m_vClients; std::vector m_vDatas; + bool m_wait; WP get(); diff --git a/src/server/clients.cpp b/src/server/clients.cpp index 380965c..10d0d88 100644 --- a/src/server/clients.cpp +++ b/src/server/clients.cpp @@ -27,7 +27,8 @@ void Clients::shutdownClients(std::optional Clients::create(WP server) { - auto c = SP(new Clients()); +SP Clients::create(WP server, bool wait) { + auto c = SP(new Clients(wait)); vpClients.emplace_back(c); c->m_self = c; c->m_wpServer = server; @@ -53,7 +54,7 @@ WP Clients::get() { Clients::~Clients() { for (auto &[thread, client] : m_vClients) { if (thread.joinable()) - thread.detach(); + m_wait ? thread.join() : thread.detach(); kick(WP(client)); } vpClients.erase(std::remove_if(vpClients.begin(), vpClients.end(), [this](const WP &wptr) { return !wptr.owner_before(m_self) && !m_self.owner_before(wptr); }), vpClients.end()); -- cgit v1.2.3