PIIODevice threaded read refactoring
This commit is contained in:
@@ -76,9 +76,9 @@ typedef std::function<bool(const uchar *, int, void *)> ReadRetFunc;
|
||||
//! \~\brief
|
||||
//! \~english Base class for input/output devices.
|
||||
//! \~russian Базовый класс утройств ввода/вывода.
|
||||
class PIP_EXPORT PIIODevice: public PIThread
|
||||
class PIP_EXPORT PIIODevice: public PIObject
|
||||
{
|
||||
PIOBJECT_SUBCLASS(PIIODevice, PIThread);
|
||||
PIOBJECT_SUBCLASS(PIIODevice, PIObject);
|
||||
friend void __DevicePool_threadReadDP(void * ddp);
|
||||
public:
|
||||
NO_COPY_CLASS(PIIODevice);
|
||||
@@ -187,12 +187,11 @@ public:
|
||||
|
||||
//! \~english Set calling of \a open() enabled while threaded read on closed device
|
||||
//! \~russian Устанавливает возможность вызова \a open() при потоковом чтении на закрытом устройстве
|
||||
void setReopenEnabled(bool yes = true) {setProperty("reopenEnabled", yes);}
|
||||
void setReopenEnabled(bool yes = true);
|
||||
|
||||
//!
|
||||
//! \~english Set timeout in milliseconds between \a open() tryings if reopen is enabled
|
||||
//! \~russian Устанавливает задержку в миллисекундах между вызовами \a open() если переоткрытие активно
|
||||
void setReopenTimeout(int msecs) {setProperty("reopenTimeout", msecs);}
|
||||
void setReopenTimeout(int msecs);
|
||||
|
||||
//! \~english Returns reopen enable
|
||||
//! \~russian Возвращает активно ли переоткрытие
|
||||
@@ -230,33 +229,41 @@ public:
|
||||
|
||||
//! \~english Returns if threaded read is started
|
||||
//! \~russian Возвращает запущен ли поток чтения
|
||||
bool isThreadedRead() const {return isRunning();}
|
||||
bool isThreadedRead() const;
|
||||
|
||||
//! \~english Start threaded read
|
||||
//! \~russian Запускает потоковое чтение
|
||||
void startThreadedRead() {if (!isRunning()) PIThread::start();}
|
||||
void startThreadedRead();
|
||||
|
||||
//! \~english Start threaded read and assign threaded read callback to "func"
|
||||
//! \~russian Запускает потоковое чтение и устанавливает callback потокового чтения в "func"
|
||||
void startThreadedRead(ReadRetFunc func) {func_read = func; startThreadedRead();}
|
||||
void startThreadedRead(ReadRetFunc func);
|
||||
|
||||
//! \~english Stop threaded read. Hard stop terminate thread, otherwise wait fo 10 seconds
|
||||
//! \~russian Останавливает потоковое чтение. Жесткая остановка убивает поток, иначе ожидает 10 секунд
|
||||
void stopThreadedRead(bool hard = true);
|
||||
//! \~english Stop threaded read.
|
||||
//! \~russian Останавливает потоковое чтение.
|
||||
void stopThreadedRead();
|
||||
|
||||
//! \~english Wait for threaded read finish no longer than "timeout_ms" milliseconds.
|
||||
//! \~russian Ожидает завершения потокового чтения в течении не более "timeout_ms" миллисекунд.
|
||||
bool waitThreadedReadFinished(int timeout_ms = -1);
|
||||
|
||||
|
||||
//! \~english Returns if threaded write is started
|
||||
//! \~russian Возвращает запущен ли поток записи
|
||||
bool isThreadedWrite() const {return write_thread.isRunning();}
|
||||
bool isThreadedWrite() const;
|
||||
|
||||
//! \~english Start threaded write
|
||||
//! \~russian Запускает потоковую запись
|
||||
void startThreadedWrite() {if (!write_thread.isRunning()) write_thread.startOnce();}
|
||||
|
||||
//! \~english Stop threaded write. Hard stop terminate thread, otherwise wait fo 10 seconds
|
||||
//! \~russian Останавливает потоковую запись. Жесткая остановка убивает поток, иначе ожидает 10 секунд
|
||||
void stopThreadedWrite(bool hard = true);
|
||||
void startThreadedWrite();
|
||||
|
||||
//! \~english Stop threaded write.
|
||||
//! \~russian Останавливает потоковую запись.
|
||||
void stopThreadedWrite();
|
||||
|
||||
//! \~english Wait for threaded write finish no longer than "timeout_ms" milliseconds.
|
||||
//! \~russian Ожидает завершения потоковой записи в течении не более "timeout_ms" миллисекунд.
|
||||
bool waitThreadedWriteFinished(int timeout_ms = -1);
|
||||
|
||||
//! \~english Clear threaded write task queue
|
||||
//! \~russian Очищает очередь потоковой записи
|
||||
void clearThreadedWriteQueue();
|
||||
@@ -266,18 +273,18 @@ public:
|
||||
//! \~russian Запускает потоковое чтение и запись
|
||||
void start();
|
||||
|
||||
//! \~english Stop both threaded read and threaded write. Hard stop terminate threads, otherwise wait fo 10 seconds
|
||||
//! \~russian Останавливает потоковое чтение и запись. Жесткая остановка убивает потоки, иначе ожидает 10 секунд
|
||||
void stop(bool hard = true);
|
||||
//! \~english Stop both threaded read and threaded write.
|
||||
//! \~russian Останавливает потоковое чтение и запись.
|
||||
void stop();
|
||||
|
||||
|
||||
//! \~english Read from device maximum "max_size" bytes to "read_to"
|
||||
//! \~russian Читает из устройства не более "max_size" байт в "read_to"
|
||||
ssize_t read(void * read_to, ssize_t max_size) {return readDevice(read_to, max_size);}
|
||||
ssize_t read(void * read_to, ssize_t max_size);
|
||||
|
||||
//! \~english Read from device to memory block "mb"
|
||||
//! \~russian Читает из устройства в блок памяти "mb"
|
||||
ssize_t read(PIMemoryBlock mb) {return readDevice(mb.data(), mb.size());}
|
||||
ssize_t read(PIMemoryBlock mb);
|
||||
|
||||
//! \~english Read from device maximum "max_size" bytes and returns them as PIByteArray
|
||||
//! \~russian Читает из устройства не более "max_size" байт и возвращает данные как PIByteArray
|
||||
@@ -531,10 +538,10 @@ protected:
|
||||
//! \~russian Вызывается после жесткой остановки потока записи
|
||||
virtual void threadedWriteTerminated() {;}
|
||||
|
||||
void softStopThreadedRead();
|
||||
|
||||
static PIIODevice * newDeviceByPrefix(const char * prefix);
|
||||
|
||||
void terminate();
|
||||
|
||||
|
||||
DeviceMode mode_;
|
||||
DeviceOptions options_;
|
||||
@@ -543,27 +550,24 @@ protected:
|
||||
void * ret_data_;
|
||||
|
||||
private:
|
||||
EVENT_HANDLER2(void, check_start, void * , data, int, delim);
|
||||
EVENT_HANDLER(void, read_func);
|
||||
EVENT_HANDLER(void, write_func);
|
||||
|
||||
virtual PIIODevice * copy() const {return nullptr;}
|
||||
PIString fullPathOptions() const;
|
||||
void _init();
|
||||
void begin() override;
|
||||
void run() override;
|
||||
void end() override {terminate();}
|
||||
static void cacheFullPath(const PIString & full_path, const PIIODevice * d);
|
||||
static PIMap<PIConstChars, FabricInfo> & fabrics();
|
||||
|
||||
PITimer timer;
|
||||
PITimeMeasurer tm;
|
||||
PIThread write_thread;
|
||||
PITimeMeasurer tm, reopen_tm;
|
||||
PIThread read_thread, write_thread;
|
||||
PIByteArray buffer_in, buffer_tr;
|
||||
PIQueue<PIPair<PIByteArray, ullong> > write_queue;
|
||||
ullong tri;
|
||||
ssize_t readed_;
|
||||
uint threaded_read_buffer_size;
|
||||
bool init_, thread_started_, raise_threaded_read_;
|
||||
uint threaded_read_buffer_size, reopen_timeout = 1000;
|
||||
std::atomic_bool reading_now;
|
||||
bool init_, thread_started_, raise_threaded_read_, reopen_enabled = true;
|
||||
|
||||
static PIMutex nfp_mutex;
|
||||
static PIMap<PIString, PIString> nfp_cache;
|
||||
|
||||
Reference in New Issue
Block a user