summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-22 17:38:23 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-22 18:04:43 +0800
commitc76c01d1fd2ccbf91a6c3e0a120ed68c37ff106b (patch)
treeba3f7bf6402539c0ca65eb8a3b88d85ed6b526eb
parent0028a4673d092e0dc8c57cce75cb158ad09826de (diff)
API(server/clients:newClient): allow setting independent clients to wait
fix!(server/clients:newClient): pass m_track also
-rw-r--r--include/libsock/server/client.hpp4
-rw-r--r--include/libsock/server/clients.hpp8
-rw-r--r--src/server/client.cpp4
-rw-r--r--src/server/clients.cpp13
4 files changed, 13 insertions, 16 deletions
diff --git a/include/libsock/server/client.hpp b/include/libsock/server/client.hpp
index 1d07837..0c3f869 100644
--- a/include/libsock/server/client.hpp
+++ b/include/libsock/server/client.hpp
@@ -49,7 +49,7 @@ class Client {
private:
void init();
- Client(SP<Server> server, SP<Clients> clients, bool track = false, bool oneShot = true);
+ Client(SP<Server> server, SP<Clients> clients, bool track = false, bool wait = false);
WP<Client> m_self;
WP<Server> m_wpServer;
@@ -61,7 +61,7 @@ class Client {
std::string m_ip;
int m_port;
bool m_track;
- bool m_oneShot;
+ bool m_wait;
std::optional<std::string> m_szReading = std::nullopt;
diff --git a/include/libsock/server/clients.hpp b/include/libsock/server/clients.hpp
index dbe7099..4b67c23 100644
--- a/include/libsock/server/clients.hpp
+++ b/include/libsock/server/clients.hpp
@@ -21,10 +21,10 @@ struct SData {
class Clients : public std::enable_shared_from_this<Clients> {
public:
- static SP<Clients> create(WP<Server> server, bool wait = false);
+ static SP<Clients> create(WP<Server> server);
~Clients();
- SP<Client> newClient(std::function<void(SP<Client> &)> cb = [](SP<Client>) {});
+ SP<Client> newClient(std::function<void(SP<Client> &)> cb = [](SP<Client>) {}, bool track = true, bool wait = false);
void broadcast(const std::string &msg, std::optional<WP<Client>> self = std::nullopt); // second param only specified when we
// want to exclude the sender
@@ -38,13 +38,11 @@ class Clients : public std::enable_shared_from_this<Clients> {
std::vector<SData> getDatas() const;
private:
- Clients(bool wait = false);
-
+ Clients();
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/client.cpp b/src/server/client.cpp
index cfd06ee..e35d8cc 100644
--- a/src/server/client.cpp
+++ b/src/server/client.cpp
@@ -13,9 +13,9 @@
using namespace LibSock::Server;
-Client::Client(SP<Server> server, SP<Clients> clients, bool track, bool oneShot)
+Client::Client(SP<Server> server, SP<Clients> clients, bool track, bool wait)
: m_track(track)
- , m_oneShot(oneShot) {
+ , m_wait(wait) {
m_wpServer = std::move(server);
m_wpClients = std::move(clients);
diff --git a/src/server/clients.cpp b/src/server/clients.cpp
index 10d0d88..5337769 100644
--- a/src/server/clients.cpp
+++ b/src/server/clients.cpp
@@ -27,8 +27,7 @@ void Clients::shutdownClients(std::optional<std::function<bool(const std::vector
m_vClients.clear();
}
-Clients::Clients(bool wait)
- : m_wait(wait) {
+Clients::Clients() {
if (std::atexit([]() {
for (auto c : vpClients)
if (const auto p = c.lock())
@@ -37,8 +36,8 @@ Clients::Clients(bool wait)
void(); // failed to register exit handler...
}
-SP<Clients> Clients::create(WP<Server> server, bool wait) {
- auto c = SP<Clients>(new Clients(wait));
+SP<Clients> Clients::create(WP<Server> server) {
+ auto c = SP<Clients>(new Clients());
vpClients.emplace_back(c);
c->m_self = c;
c->m_wpServer = server;
@@ -54,14 +53,14 @@ WP<Clients> Clients::get() {
Clients::~Clients() {
for (auto &[thread, client] : m_vClients) {
if (thread.joinable())
- m_wait ? thread.join() : thread.detach();
+ client->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());
}
-SP<Client> Clients::newClient(std::function<void(SP<Client> &)> cb) {
- SP client = SP<Client>(new Client(m_wpServer.lock(), shared_from_this()));
+SP<Client> Clients::newClient(std::function<void(SP<Client> &)> cb, bool track, bool wait) {
+ SP client = SP<Client>(new Client(m_wpServer.lock(), shared_from_this(), track, wait));
auto &instance = m_vClients.emplace_back(std::jthread([&client, &cb]() { client->init(); cb(client); }), client);
instance.second->m_self = std::weak_ptr<Client>(instance.second);
return client;