16. Ресурсы в системе OpenSCADA (Res, ResAlloc, ResMtx, MtxAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах "Res" и "ResAlloc". Объект "Res" предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте "ResAlloc" реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта "TCntrNode", который содержит механизм подключения через шаблон "AutoHD". Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от "TCntrNode" шаблон "AutoHD" поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект R/W ресурса (ResRW)
Публичные методы:
- ResRW( ); — Инициализация ресурса.
- static void resRequestW( long tm = 0 ); — Запрос ресурса на запись/модификацию с таймаутом ожидания tm (в миллисекундах).
- bool resTryW( ); — Попытка захвата ресурса на запись/модификацию. При успешном захвате возвращает "true" иначе "false".
- static void resRequestR( long tm = 0 ); — Запрос ресурса на чтение с таймаутом ожидания tm (в миллисекундах).
- bool resTryR( ); — Попытка захвата ресурса на чтение. При успешном захвате возвращает "true" иначе "false".
- static void resRelease( ); — Освобождение ресурса.
16.2. Объект автоматического освобождения R/W ресурса (ResAlloc)
Публичные методы:
- ResAlloc( ResRW &rid ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid.
- ResAlloc( ResRW &rid, bool write, long tm = 0 ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid. С указанием типа ресурса write (чтение/запись).
- void request( bool write = false, long tm = 0 ); void lock( bool write = false, unsigned short tm = 0 ); — Запрос ресурса в указанном режиме write (чтение/запись).
- void release( ); void unlock( ); — Освобождение ресурса.
16.3. Шаблон (AutoHD)
Публичные методы:
- AutoHD( ); — Инициализация без привязки к объекту.
- AutoHD( ORes *node, const string &who = "" ); — Инициализация с привязкой к объекту node. Объект должен содержать функцию AHDConnect() и AHDDisConnect().
- AutoHD( const AutoHD &hd ); — Копирующий конструктор.
- template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s ); — Конструктор приведения типов в безопасном режиме приведения (посредством dynamic_cast). Возвращает свободный ресурс в случае невозможности приведения.
- ORes &at( ) const; — Получение объекта за ресурсом.
- AutoHD &operator=(const AutoHD &hd); — Копирование ресурсов.
- bool operator==(const AutoHD &hd); — Сравнение объектов за ресурсом по указателю.
- void free( ); — Освобождение ресурса.
- bool freeStat( ) const; — Признак "Ресурс свободен".
16.4. Объект захвата ресурсов, мютексом (ResMtx)
Публичные методы:
- ResMtx( bool isRecurs = false ); — Инициализация объекта мютекса с рекурсией isRecurs.
- void lock( ); — Захват мютекса. Возврат нуля в случае успеха.
- void unlock( ); — Освобождение мютекса. Возврат нуля в случае успеха.
- int tryLock( ); — Проба захвата мютекса, без ожидания освобождения. Возврат нуля в случае успеха.
- pthread_mutex_t &mtx( ); — Прямая ссылка на структуру мютекса.
16.5. Объект строки с доступом, разделённым ресурсом (ResString)
Публичные методы:
- explicit ResString( const string &vl = "" ); — Инициализация строки с указанным значением vl.
- ResString &operator=( const string &val ); — Функция неявного преобразования из std::string.
- operator string( ); — Функция неявного преобразования в std::string.
- size_t size( ); — Размер строки.
- bool empty( ); — Строка пуста.
- void setVal( const string &vl ); — Установка значения строки в vl.
- const string &getVal( ); — Получение значения строки.
- const string &getValRef( ); — Получение прямой ссылки на строку std::string. Ресурс игнорируется в случае использования этой функции!
16.6. Объект условной переменной, по мютексу (CondVar)
Публичные методы:
- CondVar( ); — Инициализация условной переменной.
- int wait( ResMtx &mtx, unsigned short tm = 0 ); — ожидание пробуждения по условной переменной с таймаутом tm и мютексом mtx.
- int wakeOne( ); — пробуждение одного потока.
- int wakeAll( ); — пробуждение всех потоков.
16.7. Объект автоматического освобождения POSIX мютекса (MtxAlloc)
Публичные методы:
- MtxAlloc( ResMtx &iM, bool lock = false ); — Инициализация автоматически освобождающегося мютекса для ранее выделенного идентификатора iM. С указанием блокировки lock при создании.
- int lock( ); — Захват ресурса. Возврат нуля при успешном выполнении.
- int unlock( ); — Освобождение ресурса. Возврат нуля при успешном выполнении.
- int tryLock( ); — Проба захвата ресурса, без ожидания освобождения. Возврат нуля при успешном выполнении.
16.8. Объект строки с доступом, разделённым глобальным ресурсом(мютексом) данных (MtxString)
Публичные методы:
- MtxString( ResMtx &iM ); — Инициализация строки с разделением доступа ресурсом iM.
- MtxString &operator=( const string &val ); — Функция неявного преобразования из std::string.
- operator string( ); — Функция неявного преобразования в std::string.
- size_t size( ); — Размер строки.
- bool empty( ); — Строка пуста.
- void setVal( const string &vl ); — Установка значения строки в vl.
- const string &getVal( ); — Получение значения строки.
- const string &getValRef( ); — Получение прямой ссылки на строку std::string. Ресурс игнорируется в случае использования этой функции!