16. Ресурсы в системе OpenSCADA (Res, ResAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах <Res> и <ResAlloc>. Объект <Res> предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте <ResAlloc> реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта TCntrNode, который содержит механизм подключения через шаблон AutoHD. Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от TCntrNode шаблон AutoHD поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект ресурса (Res)
Публичные методы:
- Res( ); — Инициализация ресурса.
- 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. Объект ресурса (ResAlloc)
Публичные методы:
- ResAlloc( Res &rid ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>.
- ResAlloc( Res &rid, bool write, long tm = 0 ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>. С указанием типа ресурса <write> (чтение/запись).
- void request( bool write = false, long tm = 0 ); — Запрос ресурса в указанном режиме <write> (чтение/запись).
- void release( ); — Освобождение ресурса.
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. Объект строки с доступом, разделённым ресурсом (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. Ресурс игнорируется в случае использования этой функции!