summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-22 17:31:09 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-22 17:31:09 +0800
commit0028a4673d092e0dc8c57cce75cb158ad09826de (patch)
treed18e7e2c38fa453d4ae381ae902a452e5ce32e23
parent9916e484e30912b83881744e758400b1de854c66 (diff)
API(server/clients:create): optional wait argument making ClientManager wait for client thread to finish
-rw-r--r--include/libsock/server/clients.hpp6
-rw-r--r--src/server/clients.cpp9
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<Clients> {
public:
- static SP<Clients> create(WP<Server> server);
+ static SP<Clients> create(WP<Server> server, bool wait = false);
~Clients();
SP<Client> newClient(std::function<void(SP<Client> &)> cb = [](SP<Client>) {});
@@ -38,11 +38,13 @@ class Clients : public std::enable_shared_from_this<Clients> {
std::vector<SData> getDatas() const;
private:
- Clients();
+ Clients(bool wait = false);
+
void broadcast(const SData &msg);
std::vector<std::pair<std::jthread, SP<Client>>> m_vClients;
std::vector<SData> m_vDatas;
+ bool m_wait;
WP<Clients> 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<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());