From f8818c85379c2160dcf254170c34a750fcdf53fb Mon Sep 17 00:00:00 2001 From: andrey Date: Thu, 12 Aug 2021 19:50:17 +0300 Subject: [PATCH] picloud patch --- libs/cloud/picloudclient.cpp | 2 +- utils/cloud_dispatcher/dispatcherclient.cpp | 7 ++++ utils/cloud_dispatcher/dispatcherclient.h | 1 + utils/cloud_dispatcher/dispatcherserver.cpp | 44 +++++++++++++-------- utils/cloud_dispatcher/dispatcherserver.h | 1 + 5 files changed, 37 insertions(+), 18 deletions(-) diff --git a/libs/cloud/picloudclient.cpp b/libs/cloud/picloudclient.cpp index b85c6adb..aae1d89e 100644 --- a/libs/cloud/picloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -130,7 +130,7 @@ void PICloudClient::_readed(PIByteArray & ba) { break; case PICloud::TCP::Disconnect: is_connected = false; - eth.stop(); + static_cast(ð)->stop(); eth.close(); disconnected(); break; diff --git a/utils/cloud_dispatcher/dispatcherclient.cpp b/utils/cloud_dispatcher/dispatcherclient.cpp index 9446df30..cc86dcd6 100644 --- a/utils/cloud_dispatcher/dispatcherclient.cpp +++ b/utils/cloud_dispatcher/dispatcherclient.cpp @@ -26,6 +26,13 @@ PIString DispatcherClient::address() { } void DispatcherClient::close() { + static_cast(eth)->stop(false); + eth->close(); +} + + +void DispatcherClient::terminate() { + eth->stop(); eth->close(); } diff --git a/utils/cloud_dispatcher/dispatcherclient.h b/utils/cloud_dispatcher/dispatcherclient.h index 7cb9629e..90b20461 100644 --- a/utils/cloud_dispatcher/dispatcherclient.h +++ b/utils/cloud_dispatcher/dispatcherclient.h @@ -13,6 +13,7 @@ public: ~DispatcherClient(); void start(); void close(); + void terminate(); void sendConnected(uint client_id); void sendDisconnected(uint client_id); void sendData(const PIByteArray & data); diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index 781e5e41..21cdf9e2 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -43,22 +43,26 @@ void DispatcherServer::picoutStatus() { void DispatcherServer::cleanClients() { - PIVector rm; map_mutex.lock(); + for (auto c: rmrf_clients) { + delete c; + } + rmrf_clients.clear(); for (auto c: clients) { if (!index_c_servers.contains(c) && !index_c_clients.contains(c)) { - if (rm_clients.contains(c)) rm << c; - else rm_clients << c; + if (!rm_clients.contains(c)) rm_clients << c; } else rm_clients.removeAll(c); } for (auto c: rm_clients) { - if (clients.contains(c)) rm << c; + if (clients.contains(c)) { + rmrf_clients << c; + } + } + for (auto c: rmrf_clients) { + clients.removeAll(c); + rm_clients.removeAll(c); } map_mutex.unlock(); - for (auto c: rm) { - c->close(); -// c->deleteLater(); - } } @@ -83,6 +87,12 @@ void DispatcherServer::updateConnectionsTile(TileList * tl) { } tl->content << TileList::Row(c->address() + " " + role, PIScreenTypes::CellFormat()); } + for (auto c: rm_clients) { + tl->content << TileList::Row("[deleting]" + c->address(), PIScreenTypes::CellFormat()); + } + for (auto c: rmrf_clients) { + tl->content << TileList::Row("[NULL]" + c->address(), PIScreenTypes::CellFormat()); + } map_mutex.unlock(); } @@ -160,35 +170,35 @@ void DispatcherServer::disconnectClient(DispatcherClient *client) { } piCoutObj << "remove client" << client->clientId(); map_mutex.lock(); - clients.removeOne(client); + clients.removeAll(client); + rm_clients.removeAll(client); CloudServer * cs = index_c_servers.value(client, nullptr); if (cs) { PIVector cscv = cs->getClients(); for(auto csc : cscv) { - clients.removeOne(csc); - index_c_clients.removeOne(csc); + clients.removeAll(csc); + index_c_clients.remove(csc); cs->removeClient(csc); csc->close(); - csc->deleteLater(); + rmrf_clients << csc; } c_servers.remove(cs->serverUUID()); - index_c_servers.removeOne(client); + index_c_servers.remove(client); delete cs; } CloudServer * cc = index_c_clients.value(client, nullptr); if (cc) { cc->removeClient(client); - index_c_clients.removeOne(client); + index_c_clients.remove(client); } client->close(); + rmrf_clients << client; map_mutex.unlock(); - client->deleteLater(); } void DispatcherServer::newConnection(PIEthernet *cl) { - if (clients.size_s() >= max_connections) { - cl->close(); + if (clients.size() >= max_connections) { delete cl; return; } diff --git a/utils/cloud_dispatcher/dispatcherserver.h b/utils/cloud_dispatcher/dispatcherserver.h index 03b92f7a..02e025f2 100644 --- a/utils/cloud_dispatcher/dispatcherserver.h +++ b/utils/cloud_dispatcher/dispatcherserver.h @@ -34,6 +34,7 @@ private: PIMap index_c_servers; PIMap index_c_clients; PIVector rm_clients; + PIVector rmrf_clients; PITimer timeout_timer; PIMutex map_mutex; uint client_gid;