From d46b5e008ad474e2393876740e840275675936d8 Mon Sep 17 00:00:00 2001 From: peri4 Date: Sat, 1 Jun 2024 22:27:39 +0300 Subject: [PATCH] try to fix cloud again --- CMakeLists.txt | 2 +- libs/cloud/picloudserver.cpp | 2 +- libs/main/cloud/picloudserver.h | 2 +- utils/cloud_dispatcher/cloudserver.cpp | 2 +- utils/cloud_dispatcher/dispatcherclient.cpp | 13 +++++++++---- utils/cloud_dispatcher/dispatcherclient.h | 1 + utils/cloud_dispatcher/dispatcherserver.cpp | 16 ++++++++-------- utils/cloud_dispatcher/dispatcherserver.h | 4 ++-- 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aec52bb3..240af29f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(PIP) set(PIP_MAJOR 3) set(PIP_MINOR 19) -set(PIP_REVISION 2) +set(PIP_REVISION 3) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) set(PIP_DOMAIN org.SHS) diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index f3d35488..bd4a67d3 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -55,7 +55,7 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) open_mutex.unlock(); ping_timer.stop(); }); - CONNECTL(&ping_timer, tickEvent, [this](void *, int) { + ping_timer.setSlot([this]() { if (eth.isConnected()) tcp.sendPing(); }); } diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index c41c36b6..cb36cd14 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -89,7 +89,7 @@ private: PIVector clients_; PIVector removed_clients_; PIMap index_clients; - PITimer ping_timer; + PIThread ping_timer; PIConditionVariable cvar; PIMutex open_mutex; mutable PIMutex clients_mutex; diff --git a/utils/cloud_dispatcher/cloudserver.cpp b/utils/cloud_dispatcher/cloudserver.cpp index e449fc48..dad98355 100644 --- a/utils/cloud_dispatcher/cloudserver.cpp +++ b/utils/cloud_dispatcher/cloudserver.cpp @@ -7,8 +7,8 @@ CloudServer::CloudServer(DispatcherClient * c, const PIByteArray & sname): serve last_ping.reset(); mutex_clients.lock(); DispatcherClient * cl = index_clients.value(id, nullptr); - if (cl) cl->sendData(ba); mutex_clients.unlock(); + if (cl) cl->sendData(ba); })); connects << CONNECTL(c, pingReceived, [this]() { last_ping.reset(); }); last_ping.reset(); diff --git a/utils/cloud_dispatcher/dispatcherclient.cpp b/utils/cloud_dispatcher/dispatcherclient.cpp index 8fa09715..5d600de6 100644 --- a/utils/cloud_dispatcher/dispatcherclient.cpp +++ b/utils/cloud_dispatcher/dispatcherclient.cpp @@ -22,6 +22,7 @@ void DispatcherClient::start() { DispatcherClient::~DispatcherClient() { + PIMutexLocker send_lock(mutex_send); piDeleteSafety(eth); } @@ -43,28 +44,32 @@ void DispatcherClient::stop() { void DispatcherClient::sendConnected(uint client_id) { piCoutObj << "sendConnected" << client_id; + PIMutexLocker send_lock(mutex_send); tcp.sendConnected(client_id); } void DispatcherClient::sendDisconnected(uint client_id) { piCoutObj << "sendDisconnected" << client_id; + PIMutexLocker send_lock(mutex_send); tcp.sendDisconnected(client_id); } void DispatcherClient::sendData(const PIByteArray & data) { - if (tcp.role() == PICloud::TCP::Client) + if (tcp.role() == PICloud::TCP::Client) { + PIMutexLocker send_lock(mutex_send); tcp.sendData(data); - else + } else piCoutObj << "error sendData, invalid role"; } void DispatcherClient::sendDataToClient(const PIByteArray & data, uint client_id) { - if (tcp.role() == PICloud::TCP::Server) + if (tcp.role() == PICloud::TCP::Server) { + PIMutexLocker send_lock(mutex_send); tcp.sendData(data, client_id); - else + } else piCoutObj << "error sendDataToClient, invalid role"; } diff --git a/utils/cloud_dispatcher/dispatcherclient.h b/utils/cloud_dispatcher/dispatcherclient.h index 7c315187..f9150006 100644 --- a/utils/cloud_dispatcher/dispatcherclient.h +++ b/utils/cloud_dispatcher/dispatcherclient.h @@ -39,6 +39,7 @@ private: PIEthernet * eth; PIStreamPacker streampacker; PICloud::TCP tcp; + PIMutex mutex_send; uint client_id; }; diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index 0cee5f78..ea9933bc 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -59,7 +59,7 @@ void DispatcherServer::cleanClients() { if (!index_c_servers.contains(c) && !index_c_clients.contains(c)) { if (!rm_clients.contains(c)) rm_clients << c; } else - rm_clients.removeAll(c); + rm_clients.remove(c); } auto ss = c_servers.values(); for (auto c: ss) { @@ -76,7 +76,7 @@ void DispatcherServer::cleanClients() { index_c_clients.remove(csc); c->removeClient(csc); csc->close(); - if (!rmrf_clients.contains(csc)) rmrf_clients << csc; + rmrf_clients << csc; } c_servers.remove(c->serverUUID()); index_c_servers.remove(c->getConnection()); @@ -86,7 +86,7 @@ void DispatcherServer::cleanClients() { } for (auto c: rm_clients) { if (clients.contains(c)) { - if (!rmrf_clients.contains(c)) rmrf_clients << c; + rmrf_clients << c; } } for (auto c: rmrf_clients) { @@ -96,7 +96,7 @@ void DispatcherServer::cleanClients() { index_c_servers.remove(c); } index_c_clients.remove(c); - rm_clients.removeAll(c); + rm_clients.remove(c); } } @@ -201,7 +201,7 @@ void DispatcherServer::disconnectClient(DispatcherClient * client) { } piCoutObj << "remove ..." << client->clientId(); clients.removeAll(client); - rm_clients.removeAll(client); + rm_clients.remove(client); CloudServer * cs = index_c_servers.value(client, nullptr); if (cs) { piCoutObj << "remove Server" << client->clientId(); @@ -210,11 +210,11 @@ void DispatcherServer::disconnectClient(DispatcherClient * client) { for (auto csc: cscv) { clients.removeAll(csc); index_c_clients.remove(csc); - if (!rmrf_clients.contains(csc)) rmrf_clients << csc; + rmrf_clients << csc; } c_servers.remove(cs->serverUUID()); index_c_servers.remove(client); - if (!rmrf_servers.contains(cs)) rmrf_servers << cs; + rmrf_servers << cs; } CloudServer * cc = index_c_clients.value(client, nullptr); if (cc) { @@ -223,7 +223,7 @@ void DispatcherServer::disconnectClient(DispatcherClient * client) { index_c_clients.remove(client); } // client->close(); - if (!rmrf_clients.contains(client)) rmrf_clients << client; + rmrf_clients << client; piCoutObj << "remove done" << client->clientId(); } diff --git a/utils/cloud_dispatcher/dispatcherserver.h b/utils/cloud_dispatcher/dispatcherserver.h index 4c4cc82a..a9b01c10 100644 --- a/utils/cloud_dispatcher/dispatcherserver.h +++ b/utils/cloud_dispatcher/dispatcherserver.h @@ -34,8 +34,8 @@ private: PIMap c_servers; PIMap index_c_servers; PIMap index_c_clients; - PIVector rm_clients; - PIVector rmrf_clients; + PISet rm_clients; + PISet rmrf_clients; PIVector rmrf_servers; PITimer timeout_timer; PIMutex map_mutex;