16. Ðåñóðñû â ñèñòåìå OpenSCADA (Res, ResAlloc, ResMtx, MtxAlloc, AutoHD)
Áîëüøèíñòâî óçëîâ è ïîäñèñòåì ñèñòåìû OpenSCADA ÿâëÿþòñÿ äèíàìè÷åñêèìè, ò.å. äîïóñêàþò ñîçäàíèå/óäàëåíèå/êîíôèãóðàöèþ â ïðîöåññå ôóíêöèîíèðîâàíèÿ ñèñòåìû. Ó÷èòûâàÿ ìíîãîïîòî÷íîñòü ñèñòåìû, äàííàÿ ôóíêöèîíàëüíîñòü íàêëàäûâàåò æåñòêèå òðåáîâàíèÿ ê ñèíõðîíèçàöèè ïîòîêîâ. Äëÿ ñèíõðîíèçàöèè â ñèñòåìå èñïîëüçóþòñÿ ðåñóðñû, ôóíêöèè êîòîðûõ ëîêàëèçîâàíû â îáúåêòàõ "Res" è "ResAlloc". Îáúåêò "Res" ïðåäîñòàâëÿåò õðàíèëèùå ðåñóðñà, ïðåäóñìàòðèâàþùåãî ôóíêöèè çàõâàòà/îñâîáîæäåíèÿ íà ÷òåíèå è çàïèñü.  îáúåêòå "ResAlloc" ðåàëèçîâàíû ôóíêöèè àâòîìàòè÷åñêîãî îñâîáîæäåíèÿ ðåñóðñà. Àâòîìàòè÷åñêèé ðåñóðñ ïîäðàçóìåâàåò ñîçäàíèå ëîêàëüíîãî îáúåêòà ðåñóðñà ñ àâòîìàòè÷åñêèì åãî îñâîáîæäåíèåì ïðè ðàçðóøåíèè (â äåñòðóêòîðå). Èñïîëüçîâàíèå àâòîìàòè÷åñêèõ ðåñóðñîâ çíà÷èòåëüíî óïðîùàåò ðàáîòó ñ ðåñóðñàìè ïðè èñïîëüçîâàíèè èñêëþ÷åíèé.
Ëþáîé äèíàìè÷åñêèé îáúåêò ñèñòåìû íàñëåäóåòñÿ îò îáúåêòà "TCntrNode", êîòîðûé ñîäåðæèò ìåõàíèçì ïîäêëþ÷åíèÿ ÷åðåç øàáëîí "AutoHD". Îñíîâíîé ôóíêöèåé øàáëîíà ÿâëÿåòñÿ õðàíåíèå ññûëêè íà îáúåêò è çàõâàò ðåñóðñà, èñêëþ÷àþùåãî óäàëåíèå îáúåêòà íà ìîìåíò èñïîëüçîâàíèÿ. Øàáëîí ïîääåðæèâàåò êîïèðîâàíèå ðåñóðñà è àâòîìàòè÷åñêîå åãî îñâîáîæäåíèå â ñëó÷àå ðàçðóøåíèÿ îáúåêòà øàáëîíà. Äëÿ íàãëÿäíîñòè äîñòóïà ê îáúåêòàì ïîðîæä¸ííûì îò "TCntrNode" øàáëîí "AutoHD" ïîääåðæèâàåò ïðèâåäåíèå òèïîâ, îñíîâàííîå íà äèíàìè÷åñêîì ïðèâåäåíèè.
16.1. Îáúåêò R/W ðåñóðñà (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. Îáúåêò àâòîìàòè÷åñêîãî îñâîáîæäåíèÿ R/W ðåñóðñà (ResAlloc)
Ïóáëè÷íûå ìåòîäû:
- ResAlloc( Res &rid ); — Èíèöèàëèçàöèÿ àâòîìàòè÷åñêè îñâîáîæäàþùåãîñÿ ðåñóðñà äëÿ ðàíåå âûäåëåííîãî èäåíòèôèêàòîðà rid.
- ResAlloc( Res &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. Îáúåêò ñòðîêè ñ äîñòóïîì, ðàçäåë¸ííûì ðåñóðñîì (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.5. Îáúåêò çàõâàòà ðåñóðñîâ, ìþòåêñîì (ResMtx)
Ïóáëè÷íûå ìåòîäû:
- ResMtx( bool isRecurs = false ); — Èíèöèàëèçàöèÿ îáúåêòà ìþòåêñà ñ ðåêóðñèåé isRecurs.
- void lock( ); — Çàõâàò ìþòåêñà. Âîçâðàò íóëÿ â ñëó÷àå óñïåõà.
- void unlock( ); — Îñâîáîæäåíèå ìþòåêñà. Âîçâðàò íóëÿ â ñëó÷àå óñïåõà.
- int tryLock( ); — Ïðîáà çàõâàòà ìþòåêñà, áåç îæèäàíèÿ îñâîáîæäåíèÿ. Âîçâðàò íóëÿ â ñëó÷àå óñïåõà.
- pthread_mutex_t &mtx( ); — Ïðÿìàÿ ññûëêà íà ñòðóêòóðó ìþòåêñà.
16.6. Îáúåêò àâòîìàòè÷åñêîãî îñâîáîæäåíèÿ POSIX ìþòåêñà (MtxAlloc)
Ïóáëè÷íûå ìåòîäû:
- MtxAlloc( pthread_mutex_t &iM, bool lock = false ); — Èíèöèàëèçàöèÿ àâòîìàòè÷åñêè îñâîáîæäàþùåãîñÿ ìþòåêñà äëÿ ðàíåå âûäåëåííîãî èäåíòèôèêàòîðà iM. Ñ óêàçàíèåì áëîêèðîâêè lock ïðè ñîçäàíèè.
- void lock( ); — Çàõâàò ðåñóðñà. Âîçâðàò íóëÿ ïðè óñïåøíîì âûïîëíåíèè.
- void unlock( ); — Îñâîáîæäåíèå ðåñóðñà. Âîçâðàò íóëÿ ïðè óñïåøíîì âûïîëíåíèè.
- int tryLock( ); — Ïðîáà çàõâàòà ðåñóðñà, áåç îæèäàíèÿ îñâîáîæäåíèÿ. Âîçâðàò íóëÿ ïðè óñïåøíîì âûïîëíåíèè.
16.7. Îáúåêò ñòðîêè ñ äîñòóïîì, ðàçäåë¸ííûì ãëîáàëüíûì ðåñóðñîì(ìþòåêñîì) äàííûõ (MtxString)
Ïóáëè÷íûå ìåòîäû:
- MtxString( pthread_mutex_t &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. Ðåñóðñ èãíîðèðóåòñÿ â ñëó÷àå èñïîëüçîâàíèÿ ýòîé ôóíêöèè!