From 3641e636d22ad197cc522d16d4e4d23e99b1682f Mon Sep 17 00:00:00 2001 From: peri4 Date: Sat, 21 Sep 2024 19:56:39 +0300 Subject: [PATCH] new PIClientServer::ClientBase::stopAndWait() method for blocking stop read. PIClientServer::ClientBase::close() now non-blocking --- libs/client_server/piclientserver_client.cpp | 1 + libs/client_server/piclientserver_client_base.cpp | 9 ++++++++- libs/main/client_server/piclientserver_client_base.h | 1 + main.cpp | 2 ++ tests/client_server/client_server_test.cpp | 8 ++++---- tests/client_server/test_client_helper.h | 10 ++++++++-- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/libs/client_server/piclientserver_client.cpp b/libs/client_server/piclientserver_client.cpp index 2319584a..2699603e 100644 --- a/libs/client_server/piclientserver_client.cpp +++ b/libs/client_server/piclientserver_client.cpp @@ -41,6 +41,7 @@ PIClientServer::Client::Client() { PIClientServer::Client::~Client() { if (tcp) tcp->setDebug(false); close(); + stopAndWait(); } diff --git a/libs/client_server/piclientserver_client_base.cpp b/libs/client_server/piclientserver_client_base.cpp index ceb09a16..4ee87169 100644 --- a/libs/client_server/piclientserver_client_base.cpp +++ b/libs/client_server/piclientserver_client_base.cpp @@ -27,6 +27,7 @@ PIClientServer::ClientBase::ClientBase() {} PIClientServer::ClientBase::~ClientBase() { close(); + stopAndWait(); if (own_tcp) piDeleteSafety(tcp); } @@ -34,7 +35,13 @@ PIClientServer::ClientBase::~ClientBase() { void PIClientServer::ClientBase::close() { if (!tcp) return; can_write = false; - tcp->interrupt(); + tcp->stop(); + stream.clear(); +} + + +void PIClientServer::ClientBase::stopAndWait() { + if (!tcp) return; tcp->stopAndWait(10_s); if (tcp->isThreadedRead()) tcp->terminateThreadedRead(); tcp->close(); diff --git a/libs/main/client_server/piclientserver_client_base.h b/libs/main/client_server/piclientserver_client_base.h index 3c1105ed..625dad80 100644 --- a/libs/main/client_server/piclientserver_client_base.h +++ b/libs/main/client_server/piclientserver_client_base.h @@ -47,6 +47,7 @@ public: const PIEthernet * getTCP() const { return tcp; } void close(); + void stopAndWait(); int write(const void * d, const size_t s); int write(const PIByteArray & ba) { return write(ba.data(), ba.size()); } diff --git a/main.cpp b/main.cpp index 39c694b5..e58a2374 100644 --- a/main.cpp +++ b/main.cpp @@ -69,6 +69,8 @@ protected: #include int main(int argc, char * argv[]) { PILog log; + log.setColorConsole(false); + log.setOutput(PILog::File, false); log.setLogName("test"); log.setDir("logs"); // log.setTimestampFormat("hh-mm-ss"); diff --git a/tests/client_server/client_server_test.cpp b/tests/client_server/client_server_test.cpp index 0535fe47..e85df95c 100644 --- a/tests/client_server/client_server_test.cpp +++ b/tests/client_server/client_server_test.cpp @@ -154,7 +154,7 @@ TEST(ClientServer, DynamicClients) { auto s = createServer(); const auto spawnClient = [&clients, &clients_mutex]() { - if (clients.size() > 100) return; + // if (clients.size() > 100) return; auto c = new ClientSendThread(); c->startSend(); clients_mutex.lock(); @@ -180,7 +180,7 @@ TEST(ClientServer, DynamicClients) { } piCout << "+++++++"; }, - 52_Hz); + 12_Hz); deleteThread.start( [&clients, &clients_mutex]() { @@ -199,9 +199,9 @@ TEST(ClientServer, DynamicClients) { } piCout << "----------"; }, - 53_Hz); + 13_Hz); - (10_s).sleep(); + (2_s).sleep(); EXPECT_GE(s->clientsCount(), 10); diff --git a/tests/client_server/test_client_helper.h b/tests/client_server/test_client_helper.h index 02ab8814..4a23ad9f 100644 --- a/tests/client_server/test_client_helper.h +++ b/tests/client_server/test_client_helper.h @@ -44,7 +44,10 @@ class TestServerClient using Base = TestClientBase; public: - ~TestServerClient() { close(); } + ~TestServerClient() { + close(); + stopAndWait(); + } private: void readed(PIByteArray data) override { Base::readInternal(data); } @@ -66,7 +69,10 @@ class TestClient using Base = TestClientBase; public: - ~TestClient() { close(); } + ~TestClient() { + close(); + stopAndWait(); + } private: void readed(PIByteArray data) override { Base::readInternal(data); }