From 16c09ae6e941416efd6fd706390f5cae5b622e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 10 Nov 2022 14:08:42 +0300 Subject: [PATCH] PIEthernet atomic connected exchange --- libs/main/io_devices/piethernet.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 17afb0ce..f38b4efc 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -763,8 +763,7 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) { //piCoutObj << errorString(); return -1; } - if (connected_) { - connected_ = false; + if (connected_.exchange(false)) { opened_ = false; piCoutObj << "Disconnect on read," << ethErrorString(); closeSocket(sock); @@ -856,13 +855,13 @@ ssize_t PIEthernet::writeDevice(const void * data, ssize_t max_size) { } if (!connected_) return -1; auto disconnectFunc = [this](){ - if (!connected_) return; - connected_ = false; - opened_ = false; - piCoutObj << "Disconnect on write," << ethErrorString(); - closeSocket(sock); - init(); - disconnected(true); + if (connected_.exchange(false)) { + opened_ = false; + piCoutObj << "Disconnect on write," << ethErrorString(); + closeSocket(sock); + init(); + disconnected(true); + } }; if (!isOptionSet(BlockingWrite)) { ret = ::send(sock, (const char *)data, max_size, 0);