From 3fa5d9d9df4067a9edde00870b31ea34364285a1 Mon Sep 17 00:00:00 2001 From: peri4 Date: Fri, 15 Mar 2024 19:49:37 +0300 Subject: [PATCH] cloud inspecting ... --- libs/main/io_devices/piethernet.cpp | 23 +++++++++++++++++---- libs/main/io_devices/piethernet.h | 8 +++---- utils/cloud_dispatcher/cloudserver.cpp | 6 ++---- utils/cloud_dispatcher/dispatcherclient.cpp | 2 +- utils/cloud_dispatcher/dispatcherserver.cpp | 5 +++-- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 07adfd5f..d9a85094 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -312,8 +312,9 @@ bool PIEthernet::closeDevice() { if (sock_s == sock) sock_s = -1; closeSocket(sock); closeSocket(sock_s); - while (!clients_.isEmpty()) - delete clients_.back(); + clients_mutex.lock(); + piDeleteAllAndClear(clients_); + clients_mutex.unlock(); if (ned) { // piCoutObj << "Disconnect on close"; disconnected(false); @@ -529,6 +530,21 @@ bool PIEthernet::listen(const PINetworkAddress & addr, bool threaded) { return listen(threaded); } +PIEthernet * PIEthernet::client(int index) { + PIMutexLocker locker(clients_mutex); + return clients_[index]; +} + +int PIEthernet::clientsCount() const { + PIMutexLocker locker(clients_mutex); + return clients_.size_s(); +} + +PIVector PIEthernet::clients() const { + PIMutexLocker locker(clients_mutex); + return clients_; +} + bool PIEthernet::send(const void * data, int size, bool threaded) { if (threaded) { @@ -823,9 +839,8 @@ void PIEthernet::applyParameters() { void PIEthernet::clientDeleted(PIObject * o) { - clients_mutex.lock(); + PIMutexLocker locker(clients_mutex); clients_.removeOne((PIEthernet *)o); - clients_mutex.unlock(); } diff --git a/libs/main/io_devices/piethernet.h b/libs/main/io_devices/piethernet.h index e10925dd..ddca15e4 100644 --- a/libs/main/io_devices/piethernet.h +++ b/libs/main/io_devices/piethernet.h @@ -251,9 +251,9 @@ public: //! Start listen for incoming TCP connections on address "addr". Use only for TCP_Server bool listen(const PINetworkAddress & addr, bool threaded = false); - PIEthernet * client(int index) { return clients_[index]; } - int clientsCount() const { return clients_.size_s(); } - PIVector clients() const { return clients_; } + PIEthernet * client(int index); + int clientsCount() const; + PIVector clients() const; //! Send data "data" with size "size" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client @@ -484,7 +484,7 @@ protected: mutable PINetworkAddress addr_r, addr_s, addr_lr; Type eth_type; PIThread server_thread_; - PIMutex clients_mutex; + mutable PIMutex clients_mutex; PIVector clients_; PIQueue mcast_queue; PIStringList mcast_groups; diff --git a/utils/cloud_dispatcher/cloudserver.cpp b/utils/cloud_dispatcher/cloudserver.cpp index e2f3c713..4353e2aa 100644 --- a/utils/cloud_dispatcher/cloudserver.cpp +++ b/utils/cloud_dispatcher/cloudserver.cpp @@ -54,9 +54,8 @@ void CloudServer::removeClient(DispatcherClient * c) { PIVector CloudServer::getClients() { - mutex_clients.lock(); + PIMutexLocker locker(mutex_clients); PIVector cl = clients; - mutex_clients.unlock(); return cl; } @@ -67,11 +66,10 @@ double CloudServer::lastPing() { void CloudServer::printStatus() { - mutex_clients.lock(); + PIMutexLocker locker(mutex_clients); piCout << " " << "Clients for" << server->address() << server_uuid.toHex() << ":"; for (auto c: clients) { piCout << " " << c->address() << c->clientId(); } - mutex_clients.unlock(); } diff --git a/utils/cloud_dispatcher/dispatcherclient.cpp b/utils/cloud_dispatcher/dispatcherclient.cpp index aa684900..6fba09b0 100644 --- a/utils/cloud_dispatcher/dispatcherclient.cpp +++ b/utils/cloud_dispatcher/dispatcherclient.cpp @@ -22,7 +22,7 @@ void DispatcherClient::start() { DispatcherClient::~DispatcherClient() { - delete eth; + piDeleteSafety(eth); } diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index 5a4740c6..33133151 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -61,6 +61,7 @@ void DispatcherServer::cleanClients() { piCout << "remove Server by ping timeout" << c->getConnection()->clientId(); PIVector cscv = c->getClients(); for (auto csc: cscv) { + if (!csc->isPIObject()) piCout << "ACHTUNG! Non-piobject DispatcherClient!"; clients.removeAll(csc); index_c_clients.remove(csc); c->removeClient(csc); @@ -183,12 +184,12 @@ void DispatcherServer::setMaxConnections(uint max_count) { void DispatcherServer::disconnectClient(DispatcherClient * client) { + PIMutexLocker locker(map_mutex); if (!clients.contains(client)) { // piCoutObj << "INVALID client" << client; return; } piCoutObj << "remove ..." << client->clientId(); - PIMutexLocker locker(map_mutex); clients.removeAll(client); rm_clients.removeAll(client); CloudServer * cs = index_c_servers.value(client, nullptr); @@ -219,6 +220,7 @@ void DispatcherServer::disconnectClient(DispatcherClient * client) { void DispatcherServer::newConnection(PIEthernet * cl) { + PIMutexLocker locker(map_mutex); if (clients.size() >= max_connections) { delete cl; return; @@ -253,7 +255,6 @@ void DispatcherServer::newConnection(PIEthernet * cl) { } }); // piCoutObj << "add client" << client; - PIMutexLocker locker(map_mutex); clients.push_back(client); client->start(); }