diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index afa1ea04..b4cc4711 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -713,9 +713,12 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) { #ifdef QNX PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif - //piCoutObj << "connect to " << ip_ << ":" << port_ << "..."; + //piCout << "connect to " << path() << "..."; + bool was_block_read_flag = blockingReadFlag(); + setBlockingReadFlag(true); connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0); - //piCoutObj << "connect to " << ip_ << ":" << port_ << connected_; + setBlockingReadFlag(was_block_read_flag); + //piCout << "connect to " << path() << connected_; if (!connected_) piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); opened_ = connected_; diff --git a/libs/main/io_devices/piiodevice.cpp b/libs/main/io_devices/piiodevice.cpp index 8b8d3cda..dd8a7e46 100644 --- a/libs/main/io_devices/piiodevice.cpp +++ b/libs/main/io_devices/piiodevice.cpp @@ -301,11 +301,6 @@ ssize_t PIIODevice::write(const void * data, ssize_t max_size) { void PIIODevice::_init() { reading_now = false; - opened_ = thread_started_ = false; - raise_threaded_read_ = true; - func_read = nullptr; - ret_data_ = nullptr; - tri = 0; setOptions(0); setReopenEnabled(true); setReopenTimeout(1000); @@ -317,6 +312,7 @@ void PIIODevice::_init() { read_thread .setName("__S__.PIIODevice.read_thread" ); write_thread.setName("__S__.PIIODevice.write_thread"); CONNECT(void, &write_thread, started, this, write_func); + CONNECTL(&read_thread, started, [this](){if (!isOpened()) open();}); read_thread.setSlot([this](void*){read_func();}); } @@ -345,6 +341,16 @@ PIIODevice * PIIODevice::newDeviceByPrefix(const char * prefix) { } +bool PIIODevice::blockingReadFlag() const { + return reading_now; +} + + +void PIIODevice::setBlockingReadFlag(bool yes) { + reading_now = yes; +} + + void PIIODevice::read_func() { if (!isReadable()) { read_thread.stop(); @@ -361,7 +367,7 @@ void PIIODevice::read_func() { } if (!ok) return; } - readed_ = read(buffer_tr.data(), buffer_tr.size_s()); + ssize_t readed_ = read(buffer_tr.data(), buffer_tr.size_s()); if (readed_ <= 0) { piMSleep(10); //cout << readed_ << ", " << errno << ", " << errorString() << endl; @@ -369,7 +375,7 @@ void PIIODevice::read_func() { } //piCoutObj << "readed" << readed_;// << ", " << errno << ", " << errorString(); threadedRead(buffer_tr.data(), readed_); - if (raise_threaded_read_) threadedReadEvent(buffer_tr.data(), readed_); + threadedReadEvent(buffer_tr.data(), readed_); } diff --git a/libs/main/io_devices/piiodevice.h b/libs/main/io_devices/piiodevice.h index 31889c93..0864514a 100644 --- a/libs/main/io_devices/piiodevice.h +++ b/libs/main/io_devices/piiodevice.h @@ -528,13 +528,15 @@ protected: virtual void threadedReadBufferSizeChanged() {;} static PIIODevice * newDeviceByPrefix(const char * prefix); + bool blockingReadFlag() const; + void setBlockingReadFlag(bool yes); DeviceMode mode_; DeviceOptions options_; - ReadRetFunc func_read; - bool opened_; - void * ret_data_; + ReadRetFunc func_read = nullptr; + bool opened_ = false; + void * ret_data_ = nullptr; private: EVENT_HANDLER(void, read_func); @@ -550,11 +552,10 @@ private: PIThread read_thread, write_thread; PIByteArray buffer_in, buffer_tr; PIQueue > write_queue; - ullong tri; - ssize_t readed_; + ullong tri = 0; uint threaded_read_buffer_size, reopen_timeout = 1000; std::atomic_bool reading_now; - bool thread_started_, raise_threaded_read_, reopen_enabled = true; + bool reopen_enabled = true; static PIMutex nfp_mutex; static PIMap nfp_cache;