PIEthernet fix tcp-server close (properly delete all clients)

PIEthernet::stopThreadedListen() method
decompose client to 2 implementations - server-side and client-side
This commit is contained in:
2024-09-11 21:41:55 +03:00
parent b24b5a1346
commit da4b09be9e
10 changed files with 257 additions and 101 deletions

View File

@@ -303,18 +303,12 @@ bool PIEthernet::closeDevice() {
// piCoutObj << "close";
bool ned = connected_;
connected_ = connecting_ = false;
server_thread_.stop();
PRIVATE->event.interrupt();
if (server_thread_.isRunning()) {
if (!server_thread_.waitForFinish(1_s)) server_thread_.terminate();
}
PRIVATE->event.destroy();
if (sock_s == sock) sock_s = -1;
closeSocket(sock);
closeSocket(sock_s);
stopThreadedListen();
clients_mutex.lock();
piDeleteAllAndClear(clients_);
auto cl = clients_;
clients_.clear();
clients_mutex.unlock();
piDeleteAll(cl);
if (ned) {
// piCoutObj << "Disconnect on close";
disconnected(false);
@@ -528,16 +522,32 @@ bool PIEthernet::listen(const PINetworkAddress & addr, bool threaded) {
return listen(threaded);
}
void PIEthernet::stopThreadedListen() {
server_thread_.stop();
PRIVATE->event.interrupt();
if (server_thread_.isRunning()) {
if (!server_thread_.waitForFinish(1_s)) server_thread_.terminate();
}
PRIVATE->event.destroy();
if (sock_s == sock) sock_s = -1;
closeSocket(sock);
closeSocket(sock_s);
}
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 *> PIEthernet::clients() const {
PIMutexLocker locker(clients_mutex);
return clients_;