From fd2e0b2eed5673d7d6c80e94a55574de33c4155e Mon Sep 17 00:00:00 2001 From: andrey Date: Wed, 7 Apr 2021 15:52:53 +0300 Subject: [PATCH] picloud fix segfault on close --- libs/cloud/picloudclient.cpp | 34 ++++++++++++++++++++++++--------- libs/cloud/picloudserver.cpp | 13 ++++++------- libs/cloud/picloudtcp.cpp | 3 ++- libs/main/cloud/picloudclient.h | 2 +- libs/main/cloud/picloudserver.h | 2 +- libs/main/cloud/picloudtcp.h | 2 +- 6 files changed, 36 insertions(+), 20 deletions(-) diff --git a/libs/cloud/picloudclient.cpp b/libs/cloud/picloudclient.cpp index b548adbc..38877d8b 100644 --- a/libs/cloud/picloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -32,13 +32,20 @@ PICloudClient::PICloudClient(const PIString & path, PIIODevice::DeviceMode mode) opened_ = false; is_connected = false; cond_connect.notifyOne(); + cond_buff.notifyOne(); piMSleep(100); }); } PICloudClient::~PICloudClient() { - stop(); + eth.close(); + if (is_connected) { + is_connected = false; + cond_buff.notifyOne(); + cond_connect.notifyOne(); + } + //stop(); close(); } @@ -55,8 +62,9 @@ void PICloudClient::setKeepConnection(bool on) { bool PICloudClient::openDevice() { - piCout << "PICloudClient open device" << path(); - bool op = eth.connect(path(), false); + PIString p = path(); + piCout << "PICloudClient open device" << p; + bool op = eth.connect(p, false); if (op) { mutex_buff.lock(); eth.startThreadedRead(); @@ -77,15 +85,20 @@ bool PICloudClient::openDevice() { bool PICloudClient::closeDevice() { - is_connected = false; + if (is_connected) { + is_connected = false; + cond_buff.notifyOne(); + cond_connect.notifyOne(); + } eth.stop(); - eth.close(); + if (eth.isOpened()) eth.close(); return true; } int PICloudClient::readDevice(void * read_to, int max_size) { piCoutObj << "readDevice"; + if (!is_connected) return -1; mutex_buff.lock(); cond_buff.wait(mutex_buff, [this](){return !buff.isEmpty();}); int sz = piMini(max_size, buff.size()); @@ -96,8 +109,9 @@ int PICloudClient::readDevice(void * read_to, int max_size) { } -int PICloudClient::writeDevice(const void * data, int max_size) { - return eth.write(data, max_size); +int PICloudClient::writeDevice(const void * data, int size) { + piCoutObj << "writeDevice"; + return tcp.sendData(PIByteArray(data, size)); } @@ -118,8 +132,10 @@ void PICloudClient::_readed(PIByteArray & ba) { eth.close(); break; case PICloud::TCP::Data: - buff.append(ba); - cond_buff.notifyOne(); + if (is_connected) { + buff.append(ba); + cond_buff.notifyOne(); + } break; default: break; diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index eba14c78..c2a62533 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -37,11 +37,6 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) PICloudServer::~PICloudServer() { stop(); - eth.stop(); - for (auto & c : clients) { - c->stop(); - c->close(); - } close(); } @@ -76,11 +71,14 @@ bool PICloudServer::closeDevice() { int PICloudServer::readDevice(void * read_to, int max_size) { + piCoutObj << "readDevice"; + piMSleep(eth.readTimeout()); return -1; } int PICloudServer::writeDevice(const void * data, int max_size) { + piCoutObj << "writeDevice"; return -1; } @@ -123,8 +121,8 @@ int PICloudServer::Client::readDevice(void * read_to, int max_size) { } -int PICloudServer::Client::writeDevice(const void * data, int max_size) { - return server->sendData(PIByteArray(data, max_size), client_id); +int PICloudServer::Client::writeDevice(const void * data, int size) { + return server->sendData(PIByteArray(data, size), client_id); } @@ -147,6 +145,7 @@ void PICloudServer::_readed(PIByteArray & ba) { if (oc) { tcp.sendDisconnected(id); } else { + piCoutObj << "new Client" << id; Client * c = new Client(this, id); clients << c; index_clients.insert(id, c); diff --git a/libs/cloud/picloudtcp.cpp b/libs/cloud/picloudtcp.cpp index 10805070..04aae4aa 100644 --- a/libs/cloud/picloudtcp.cpp +++ b/libs/cloud/picloudtcp.cpp @@ -71,13 +71,14 @@ void PICloud::TCP::sendDisconnected(uint client_id) { } -void PICloud::TCP::sendData(const PIByteArray & data) { +int PICloud::TCP::sendData(const PIByteArray & data) { header.type = PICloud::TCP::Data; PIByteArray ba; ba << header; ba.append(data); // piCout << "sendData" << ba.toHex(); streampacker->send(ba); + return data.size_s(); } diff --git a/libs/main/cloud/picloudclient.h b/libs/main/cloud/picloudclient.h index c1bbfce7..547d93cc 100644 --- a/libs/main/cloud/picloudclient.h +++ b/libs/main/cloud/picloudclient.h @@ -43,7 +43,7 @@ protected: bool closeDevice(); bool isConnected() const {return is_connected;} int readDevice(void * read_to, int max_size); - int writeDevice(const void * data, int max_size); + int writeDevice(const void * data, int size); private: EVENT_HANDLER1(void, _readed, PIByteArray &, data); diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index 484fdb4c..da00229a 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -44,7 +44,7 @@ public: bool openDevice(); bool closeDevice(); int readDevice(void * read_to, int max_size); - int writeDevice(const void * data, int max_size); + int writeDevice(const void * data, int size); private: void pushBuffer(const PIByteArray & ba); diff --git a/libs/main/cloud/picloudtcp.h b/libs/main/cloud/picloudtcp.h index e62ca2e6..ad255481 100644 --- a/libs/main/cloud/picloudtcp.h +++ b/libs/main/cloud/picloudtcp.h @@ -61,7 +61,7 @@ public: void sendStart(); void sendConnected(uint client_id); void sendDisconnected(uint client_id); - void sendData(const PIByteArray & data); + int sendData(const PIByteArray & data); int sendData(const PIByteArray & data, uint client_id); PIPair parseHeader(PIByteArray & ba); PIByteArray parseData(PIByteArray & ba);