diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-06-22 17:31:09 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-22 17:31:09 +0800 |
| commit | 0028a4673d092e0dc8c57cce75cb158ad09826de (patch) | |
| tree | d18e7e2c38fa453d4ae381ae902a452e5ce32e23 /src/server | |
| parent | 9916e484e30912b83881744e758400b1de854c66 (diff) | |
API(server/clients:create): optional wait argument making ClientManager wait for client thread to finish
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/clients.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
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<std::function<bool(const std::vector m_vClients.clear(); } -Clients::Clients() { +Clients::Clients(bool wait) + : m_wait(wait) { if (std::atexit([]() { for (auto c : vpClients) if (const auto p = c.lock()) @@ -36,8 +37,8 @@ Clients::Clients() { void(); // failed to register exit handler... } -SP<Clients> Clients::create(WP<Server> server) { - auto c = SP<Clients>(new Clients()); +SP<Clients> Clients::create(WP<Server> server, bool wait) { + auto c = SP<Clients>(new Clients(wait)); vpClients.emplace_back(c); c->m_self = c; c->m_wpServer = server; @@ -53,7 +54,7 @@ WP<Clients> Clients::get() { Clients::~Clients() { for (auto &[thread, client] : m_vClients) { if (thread.joinable()) - thread.detach(); + m_wait ? thread.join() : thread.detach(); kick(WP<Client>(client)); } vpClients.erase(std::remove_if(vpClients.begin(), vpClients.end(), [this](const WP<Clients> &wptr) { return !wptr.owner_before(m_self) && !m_self.owner_before(wptr); }), vpClients.end()); |
