Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
4dcae342
Commit
4dcae342
authored
Aug 07, 2016
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(SharedMemory): рефакторинг, оптимизация
parent
913eb480
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
61 additions
and
33 deletions
+61
-33
SharedMemory.cc
extensions/SharedMemory/SharedMemory.cc
+32
-19
SharedMemory.h
extensions/SharedMemory/SharedMemory.h
+12
-5
IOController.h
include/IOController.h
+4
-5
IONotifyController.h
include/IONotifyController.h
+2
-0
IOController.cc
src/Processes/IOController.cc
+2
-3
IONotifyController.cc
src/Processes/IONotifyController.cc
+6
-0
NCRestorer.cc
src/Processes/NCRestorer.cc
+3
-1
No files found.
extensions/SharedMemory/SharedMemory.cc
View file @
4dcae342
...
...
@@ -298,7 +298,7 @@ bool SharedMemory::activateObject()
res
=
IONotifyController
::
activateObject
();
// инициализируем указатели
for
(
auto
&&
it
:
hlist
)
for
(
auto
&&
it
:
h
b
list
)
{
it
.
a_it
=
myioEnd
();
it
.
d_it
=
myioEnd
();
...
...
@@ -312,6 +312,14 @@ bool SharedMemory::activateObject()
hit
.
ioit
=
myioEnd
();
}
for
(
auto
&&
it
:
histmap
)
{
auto
i
=
myiofind
(
it
.
first
);
if
(
i
!=
myioEnd
()
)
i
->
second
->
userdata
[
udataHistory
]
=
(
void
*
)(
&
(
it
.
second
));
}
// здесь или в startUp?
initFromReserv
();
...
...
@@ -342,7 +350,7 @@ void SharedMemory::sigterm( int signo )
// ------------------------------------------------------------------------------------------
void
SharedMemory
::
checkHeartBeat
()
{
if
(
hlist
.
empty
()
)
if
(
h
b
list
.
empty
()
)
{
if
(
wdt
&&
workready
)
wdt
->
ping
();
...
...
@@ -352,7 +360,7 @@ void SharedMemory::checkHeartBeat()
bool
wdtpingOK
=
true
;
for
(
auto
&&
it
:
hlist
)
for
(
auto
&&
it
:
h
b
list
)
{
try
{
...
...
@@ -480,7 +488,7 @@ bool SharedMemory::readItem( const std::shared_ptr<UniXML>& xml, UniXML::iterato
// без проверки на дублирование т.к.
// id - гарантирует уникальность в нашем configure.xml
hlist
.
push_back
(
hi
);
h
b
list
.
push_back
(
hi
);
return
true
;
}
...
...
@@ -560,7 +568,7 @@ void SharedMemory::readEventList( const std::string& oname )
// -----------------------------------------------------------------------------
void
SharedMemory
::
sendEvent
(
UniSetTypes
::
SystemMessage
&
sm
)
{
TransportMessage
tm
(
sm
.
transport_msg
()
);
TransportMessage
tm
(
std
::
move
(
sm
.
transport_msg
())
);
for
(
const
auto
&
it
:
elst
)
{
...
...
@@ -739,37 +747,42 @@ void SharedMemory::saveHistory()
}
}
// -----------------------------------------------------------------------------
void
SharedMemory
::
updateHistory
(
std
::
shared_ptr
<
USensorInfo
>&
s_it
,
IOController
*
)
void
SharedMemory
::
updateHistory
(
std
::
shared_ptr
<
USensorInfo
>&
usi
,
IOController
*
)
{
if
(
hist
.
empty
()
)
return
;
auto
i
=
histmap
.
find
(
s_it
->
si
.
id
);
if
(
i
==
histmap
.
end
()
)
if
(
usi
->
userdata
[
udataHistory
]
==
nullptr
)
return
;
HistoryItList
&
lst
=
*
(
static_cast
<
HistoryItList
*>
(
usi
->
userdata
[
udataHistory
]));
// auto i = histmap.find(s_it->si.id);
//
// if( i == histmap.end() )
// return;
long
value
=
0
;
long
sm_tv_sec
=
0
;
long
sm_tv_usec
=
0
;
{
uniset_rwmutex_rlock
lock
(
s_it
->
val_lock
);
value
=
s_it
->
value
;
sm_tv_sec
=
s_it
->
tv_sec
;
sm_tv_usec
=
s_it
->
tv_usec
;
uniset_rwmutex_rlock
lock
(
usi
->
val_lock
);
value
=
usi
->
value
;
sm_tv_sec
=
usi
->
tv_sec
;
sm_tv_usec
=
usi
->
tv_usec
;
}
sminfo
<<
myname
<<
"(updateHistory): "
<<
" sid="
<<
s_it
->
si
.
id
<<
" sid="
<<
usi
->
si
.
id
<<
" value="
<<
value
<<
endl
;
for
(
auto
&&
it1
:
i
->
second
)
for
(
auto
&&
it1
:
lst
)
{
History
::
iterator
it
=
it1
;
if
(
s_it
->
type
==
UniversalIO
::
DI
||
s_it
->
type
==
UniversalIO
::
DO
)
if
(
usi
->
type
==
UniversalIO
::
DI
||
usi
->
type
==
UniversalIO
::
DO
)
{
bool
st
=
(
bool
)
value
;
...
...
@@ -785,8 +798,8 @@ void SharedMemory::updateHistory( std::shared_ptr<USensorInfo>& s_it, IOControll
m_historySignal
.
emit
(
(
*
it
)
);
}
}
else
if
(
s_it
->
type
==
UniversalIO
::
AI
||
s_it
->
type
==
UniversalIO
::
AO
)
else
if
(
usi
->
type
==
UniversalIO
::
AI
||
usi
->
type
==
UniversalIO
::
AO
)
{
if
(
!
it
->
fuse_use_val
)
{
...
...
extensions/SharedMemory/SharedMemory.h
View file @
4dcae342
...
...
@@ -317,7 +317,6 @@ class SharedMemory:
void
addReadItem
(
Restorer_XML
::
ReaderSlot
sl
);
// ------------ HISTORY --------------------
typedef
std
::
deque
<
long
>
HBuffer
;
...
...
@@ -326,7 +325,7 @@ class SharedMemory:
explicit
HistoryItem
(
size_t
bufsize
=
0
)
:
id
(
UniSetTypes
::
DefaultObjectId
),
buf
(
bufsize
)
{}
HistoryItem
(
const
UniSetTypes
::
ObjectId
_id
,
const
size_t
bufsize
,
const
long
val
)
:
id
(
_id
),
buf
(
bufsize
,
val
)
{}
inline
void
init
(
unsigned
in
t
size
,
long
val
)
inline
void
init
(
size_
t
size
,
long
val
)
{
if
(
size
>
0
)
buf
.
assign
(
size
,
val
);
...
...
@@ -339,7 +338,7 @@ class SharedMemory:
void
add
(
long
val
,
size_t
size
)
{
// т.
е
. буфер у нас уже заданного размера
// т.
к
. буфер у нас уже заданного размера
// то просто удаляем очередную точку в начале
// и добавляем в конце
buf
.
pop_front
();
...
...
@@ -388,6 +387,14 @@ class SharedMemory:
typedef
std
::
list
<
History
::
iterator
>
HistoryItList
;
typedef
std
::
unordered_map
<
UniSetTypes
::
ObjectId
,
HistoryItList
>
HistoryFuseMap
;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет
//! использовать userdata[2]. (0,1 - использует IONotifyController)
// оптимизация с использованием userdata (IOController::USensorInfo::userdata) нужна
// чтобы не использовать поиск в HistoryFuseMap (см. updateHistory)
// т.к. 0,1 - использует IONotifyController (см. IONotifyController::UserDataID)
// то используем 2 - в качестве элемента userdata
static
const
size_t
udataHistory
=
2
;
typedef
sigc
::
signal
<
void
,
const
HistoryInfo
&>
HistorySlot
;
HistorySlot
signal_history
();
/*!< сигнал о срабатывании условий "сброса" дампа истории */
...
...
@@ -468,7 +475,7 @@ class SharedMemory:
void
checkHeartBeat
();
typedef
std
::
list
<
HeartBeatInfo
>
HeartBeatList
;
HeartBeatList
hlist
;
// список датчиков "сердцебиения"
HeartBeatList
h
b
list
;
// список датчиков "сердцебиения"
std
::
shared_ptr
<
WDTInterface
>
wdt
;
std
::
atomic_bool
activated
;
std
::
atomic_bool
workready
;
...
...
@@ -488,7 +495,7 @@ class SharedMemory:
History
hist
;
HistoryFuseMap
histmap
;
/*!< map для оптимизации поиска */
virtual
void
updateHistory
(
std
::
shared_ptr
<
IOController
::
USensorInfo
>&
it
,
IOController
*
);
virtual
void
updateHistory
(
std
::
shared_ptr
<
IOController
::
USensorInfo
>&
usi
,
IOController
*
);
virtual
void
saveHistory
();
void
buildHistoryList
(
xmlNode
*
cnode
);
...
...
include/IOController.h
View file @
4dcae342
...
...
@@ -285,10 +285,8 @@ class IOController:
// Дополнительные (вспомогательные поля)
UniSetTypes
::
uniset_rwmutex
val_lock
;
/*!< флаг блокирующий работу со значением */
std
::
shared_ptr
<
USensorInfo
>
it
;
static
const
size_t
MaxUserData
=
3
;
void
*
userdata
[
MaxUserData
]
=
{
nullptr
,
nullptr
,
nullptr
};
/*!< расширение для возможности хранения своей информации */
static
const
size_t
MaxUserData
=
4
;
void
*
userdata
[
MaxUserData
]
=
{
nullptr
,
nullptr
,
nullptr
,
nullptr
};
/*!< расширение для возможности хранения своей информации */
// сигнал для реализации механизма зависимостией..
// (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
...
...
@@ -301,9 +299,10 @@ class IOController:
IOController_i
::
SensorInfo
d_si
;
/*!< идентификатор датчика, от которого зависит данный */
long
d_value
;
/*!< разрешающее работу значение датчика от которого зависит данный */
long
d_off_value
;
/*!< блокирующее значение */
std
::
shared_ptr
<
USensorInfo
>
d_usi
;
// shared_ptr на датчик от которого зависит этот.
// функция обработки информации об изменении состояния датчика, от которого зависит данный
void
checkDepend
(
std
::
shared_ptr
<
USensorInfo
>&
it
,
IOController
*
);
void
checkDepend
(
std
::
shared_ptr
<
USensorInfo
>&
d_usi
,
IOController
*
);
void
init
(
const
IOController_i
::
SensorIOInfo
&
s
);
...
...
include/IONotifyController.h
View file @
4dcae342
...
...
@@ -302,6 +302,8 @@ class IONotifyController:
virtual
void
localSetValue
(
std
::
shared_ptr
<
USensorInfo
>&
usi
,
CORBA
::
Long
value
,
UniSetTypes
::
ObjectId
sup_id
)
override
;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
// идентификаторы данные в userdata (см. USensorInfo::userdata)
enum
UserDataID
{
...
...
src/Processes/IOController.cc
View file @
4dcae342
...
...
@@ -755,7 +755,6 @@ IOController::ChangeSignal IOController::signal_change_value( UniSetTypes::Objec
throw
IOController_i
::
NameNotFound
(
err
.
str
().
c_str
());
}
uniset_rwmutex_rlock
lock
(
it
->
second
->
val_lock
);
return
it
->
second
->
sigChange
;
}
// -----------------------------------------------------------------------------
...
...
@@ -779,7 +778,7 @@ IOController::ChangeUndefinedStateSignal IOController::signal_change_undefined_s
throw
IOController_i
::
NameNotFound
(
err
.
str
().
c_str
());
}
uniset_rwmutex_rlock
lock
(
it
->
second
->
val_lock
);
//
uniset_rwmutex_rlock lock(it->second->val_lock);
return
it
->
second
->
sigUndefChange
;
}
// -----------------------------------------------------------------------------
...
...
@@ -811,7 +810,7 @@ void IOController::USensorInfo::checkDepend( std::shared_ptr<USensorInfo>& d_it,
<<
endl
;
if
(
changed
)
ic
->
localSetValue
(
it
,
real_value
,
sup_id
);
ic
->
localSetValue
(
d_usi
,
real_value
,
sup_id
);
}
// -----------------------------------------------------------------------------
UniSetTypes
::
SimpleInfo
*
IOController
::
getInfo
(
::
CORBA
::
Long
userparam
)
...
...
src/Processes/IONotifyController.cc
View file @
4dcae342
...
...
@@ -265,6 +265,7 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid,
if
(
askIterator
!=
askLst
.
end
()
)
{
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
auto
s
=
myiofind
(
sid
);
if
(
s
!=
myioEnd
()
)
s
->
second
->
userdata
[
udataConsumerList
]
=
(
void
*
)(
&
(
askIterator
->
second
));
...
...
@@ -326,6 +327,7 @@ void IONotifyController::localSetValue( std::shared_ptr<IOController::USensorInf
{
uniset_rwmutex_rlock
lock
(
askIOMutex
);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if
(
usi
->
userdata
[
udataConsumerList
]
!=
nullptr
)
{
ConsumerListInfo
&
lst
=
*
(
static_cast
<
ConsumerListInfo
*>
(
usi
->
userdata
[
udataConsumerList
]));
...
...
@@ -615,6 +617,7 @@ void IONotifyController::askThreshold(UniSetTypes::ObjectId sid, const UniSetTyp
it
=
askTMap
.
find
(
sid
);
if
(
li
!=
myioEnd
()
)
{
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if
(
it
==
askTMap
.
end
()
)
li
->
second
->
userdata
[
udataThresholdList
]
=
nullptr
;
else
...
...
@@ -694,9 +697,11 @@ void IONotifyController::checkThreshold( std::shared_ptr<IOController::USensorIn
{
uniset_rwmutex_rlock
lock
(
trshMutex
);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if
(
usi
->
userdata
[
udataThresholdList
]
==
nullptr
)
return
;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
ti
=
static_cast
<
ThresholdsListInfo
*>
(
usi
->
userdata
[
udataThresholdList
]);
if
(
ti
->
list
.
empty
()
)
return
;
...
...
@@ -958,6 +963,7 @@ void IONotifyController::onChangeUndefinedState( std::shared_ptr<USensorInfo>& u
{
// lock
uniset_rwmutex_rlock
lock
(
askIOMutex
);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if
(
usi
->
userdata
[
udataConsumerList
]
!=
nullptr
)
{
ConsumerListInfo
&
lst
=
*
(
static_cast
<
ConsumerListInfo
*>
(
usi
->
userdata
[
udataConsumerList
]));
...
...
src/Processes/NCRestorer.cc
View file @
4dcae342
...
...
@@ -121,6 +121,7 @@ void NCRestorer::addthresholdlist( IONotifyController* ic, std::shared_ptr<IOCon
{
auto
i
=
ic
->
myiofind
(
inf
->
si
.
id
);
ic
->
askTMap
[
inf
->
si
.
id
].
usi
=
i
->
second
;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if
(
i
->
second
)
i
->
second
->
userdata
[
IONotifyController
::
udataThresholdList
]
=
&
(
ic
->
askTMap
[
inf
->
si
.
id
]);
}
...
...
@@ -176,7 +177,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic )
for
(
auto
it
=
ic
->
ioList
.
begin
();
it
!=
ic
->
ioList
.
end
();
++
it
)
{
// обновляем итераторы...
it
->
second
->
it
=
it
->
second
;
it
->
second
->
d_usi
=
it
->
second
;
if
(
it
->
second
->
d_si
.
id
==
DefaultObjectId
)
continue
;
...
...
@@ -186,6 +187,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic )
<<
" dep_name=("
<<
it
->
second
->
d_si
.
id
<<
")'"
<<
uniset_conf
()
->
oind
->
getMapName
(
it
->
second
->
d_si
.
id
)
<<
"'"
<<
endl
;
uniset_rwmutex_rlock
lock
(
it
->
second
->
val_lock
);
ic
->
signal_change_value
(
it
->
second
->
d_si
.
id
).
connect
(
sigc
::
mem_fun
(
it
->
second
.
get
(),
&
IOController
::
USensorInfo
::
checkDepend
)
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment