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
def3eb2f
Commit
def3eb2f
authored
Oct 24, 2022
by
Pavel Vainerman
Committed by
Pavel Vainerman
Oct 24, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
make style
parent
73b6ea42
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
167 additions
and
165 deletions
+167
-165
TestGen.cc
Utilities/codegen/tests/TestGen.cc
+2
-0
LT_Object.cc
src/Timers/LT_Object.cc
+165
-165
No files found.
Utilities/codegen/tests/TestGen.cc
View file @
def3eb2f
...
...
@@ -68,11 +68,13 @@ void TestGen::timerInfo( const TimerMessage* tm )
{
if
(
tm
->
id
==
1
)
{
cout
<<
"**** timer 1 ****"
<<
endl
;
askTimer
(
1
,
0
);
askTimer
(
2
,
3000
);
}
else
if
(
tm
->
id
==
2
)
{
cout
<<
"**** timer 2 ****"
<<
endl
;
askTimer
(
1
,
2000
);
askTimer
(
2
,
0
);
}
...
...
src/Timers/LT_Object.cc
View file @
def3eb2f
...
...
@@ -31,10 +31,10 @@ using namespace uniset;
// -----------------------------------------------------------------------------
LT_Object
::
LT_Object
()
:
sleepTime
(
UniSetTimer
::
WaitUpTime
),
lstMutex
(
"LT_Object::lstMutex"
)
sleepTime
(
UniSetTimer
::
WaitUpTime
),
lstMutex
(
"LT_Object::lstMutex"
)
{
tmLast
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
tmLast
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
}
// -----------------------------------------------------------------------------
...
...
@@ -44,192 +44,192 @@ LT_Object::~LT_Object()
// -----------------------------------------------------------------------------
timeout_t
LT_Object
::
checkTimers
(
UniSetObject
*
obj
)
{
try
{
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
if
(
tlst
.
empty
()
)
{
sleepTime
=
UniSetTimer
::
WaitUpTime
;
return
sleepTime
;
}
}
// защита от непрерывного потока сообщений
if
(
tmLast
.
getCurrent
()
<
UniSetTimer
::
MinQuantityTime
)
{
// корректируем сперва sleepTime
sleepTime
=
tmLast
.
getLeft
(
sleepTime
);
if
(
sleepTime
<
UniSetTimer
::
MinQuantityTime
)
{
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
return
sleepTime
;
}
}
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
sleepTime
=
UniSetTimer
::
WaitUpTime
;
for
(
auto
li
=
tlst
.
begin
();
li
!=
tlst
.
end
();
++
li
)
{
if
(
li
->
tmr
.
checkTime
()
)
{
// помещаем себе в очередь сообщение
TransportMessage
tm
(
TimerMessage
(
li
->
id
,
li
->
priority
,
obj
->
getId
()).
transport_msg
()
);
obj
->
push
(
tm
);
// Проверка на количество заданных тактов
if
(
!
li
->
curTick
)
{
li
=
tlst
.
erase
(
li
);
--
li
;
if
(
tlst
.
empty
()
)
sleepTime
=
UniSetTimer
::
WaitUpTime
;
continue
;
}
else
if
(
li
->
curTick
>
0
)
li
->
curTick
--
;
li
->
reset
();
}
else
{
li
->
curTimeMS
=
tmLast
.
getLeft
(
li
->
curTimeMS
);
}
// ищем минимальное оставшееся время
if
(
li
->
curTimeMS
<
sleepTime
||
sleepTime
==
UniSetTimer
::
WaitUpTime
)
sleepTime
=
li
->
curTimeMS
;
}
if
(
sleepTime
<
UniSetTimer
::
MinQuantityTime
)
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
}
// unlock
tmLast
.
reset
();
}
catch
(
const
uniset
::
Exception
&
ex
)
{
ucrit
<<
"(checkTimers): "
<<
ex
<<
endl
;
}
return
sleepTime
;
try
{
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
if
(
tlst
.
empty
()
)
{
sleepTime
=
UniSetTimer
::
WaitUpTime
;
return
sleepTime
;
}
}
// защита от непрерывного потока сообщений
if
(
tmLast
.
getCurrent
()
<
UniSetTimer
::
MinQuantityTime
)
{
// корректируем сперва sleepTime
sleepTime
=
tmLast
.
getLeft
(
sleepTime
);
if
(
sleepTime
<
UniSetTimer
::
MinQuantityTime
)
{
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
return
sleepTime
;
}
}
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
sleepTime
=
UniSetTimer
::
WaitUpTime
;
for
(
auto
li
=
tlst
.
begin
();
li
!=
tlst
.
end
();
++
li
)
{
if
(
li
->
tmr
.
checkTime
()
)
{
// помещаем себе в очередь сообщение
TransportMessage
tm
(
TimerMessage
(
li
->
id
,
li
->
priority
,
obj
->
getId
()).
transport_msg
()
);
obj
->
push
(
tm
);
// Проверка на количество заданных тактов
if
(
!
li
->
curTick
)
{
li
=
tlst
.
erase
(
li
);
--
li
;
if
(
tlst
.
empty
()
)
sleepTime
=
UniSetTimer
::
WaitUpTime
;
continue
;
}
else
if
(
li
->
curTick
>
0
)
li
->
curTick
--
;
li
->
reset
();
}
else
{
li
->
curTimeMS
=
tmLast
.
getLeft
(
li
->
curTimeMS
);
}
// ищем минимальное оставшееся время
if
(
li
->
curTimeMS
<
sleepTime
||
sleepTime
==
UniSetTimer
::
WaitUpTime
)
sleepTime
=
li
->
curTimeMS
;
}
if
(
sleepTime
<
UniSetTimer
::
MinQuantityTime
)
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
}
// unlock
tmLast
.
reset
();
}
catch
(
const
uniset
::
Exception
&
ex
)
{
ucrit
<<
"(checkTimers): "
<<
ex
<<
endl
;
}
return
sleepTime
;
}
// ------------------------------------------------------------------------------------------
timeout_t
LT_Object
::
getTimeInterval
(
TimerId
timerid
)
const
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
for
(
const
auto
&
li
:
tlst
)
{
if
(
li
.
id
==
timerid
)
return
li
.
tmr
.
getInterval
();
}
for
(
const
auto
&
li
:
tlst
)
{
if
(
li
.
id
==
timerid
)
return
li
.
tmr
.
getInterval
();
}
return
0
;
return
0
;
}
// ------------------------------------------------------------------------------------------
timeout_t
LT_Object
::
getTimeLeft
(
TimerId
timerid
)
const
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
for
(
const
auto
&
li
:
tlst
)
{
if
(
li
.
id
==
timerid
)
return
li
.
curTimeMS
;
}
for
(
const
auto
&
li
:
tlst
)
{
if
(
li
.
id
==
timerid
)
return
li
.
curTimeMS
;
}
return
0
;
return
0
;
}
// ------------------------------------------------------------------------------------------
LT_Object
::
TimersList
LT_Object
::
getTimersList
()
const
{
uniset_rwmutex_rlock
l
(
lstMutex
);
TimersList
lst
(
tlst
);
return
lst
;
uniset_rwmutex_rlock
l
(
lstMutex
);
TimersList
lst
(
tlst
);
return
lst
;
}
// ------------------------------------------------------------------------------------------
string
LT_Object
::
getTimerName
(
int
id
)
const
{
return
""
;
return
""
;
}
// ------------------------------------------------------------------------------------------
timeout_t
LT_Object
::
askTimer
(
uniset
::
TimerId
timerid
,
timeout_t
timeMS
,
clock_t
ticks
,
uniset
::
Message
::
Priority
p
)
{
if
(
timeMS
>
0
)
// заказ
{
if
(
timeMS
<
UniSetTimer
::
MinQuantityTime
)
{
ucrit
<<
"(LT_askTimer): [мс] попытка заказать таймер "
<<
getTimerName
(
timerid
)
<<
" со временем срабатывания "
<<
" меньше разрешённого "
<<
UniSetTimer
::
MinQuantityTime
<<
endl
;
timeMS
=
UniSetTimer
::
MinQuantityTime
;
}
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
// поищем а может уж такой есть
if
(
!
tlst
.
empty
()
)
{
for
(
auto
li
=
tlst
.
begin
();
li
!=
tlst
.
end
();
++
li
)
{
if
(
li
->
id
==
timerid
)
{
li
->
curTick
=
ticks
;
li
->
tmr
.
setTiming
(
timeMS
);
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): заказ на таймер ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
" "
<<
timeMS
<<
" [мс] уже есть..."
<<
endl
;
return
sleepTime
;
}
}
}
// TimerInfo newti(timerid, timeMS, ticks, p);
tlst
.
emplace_back
(
timerid
,
timeMS
,
ticks
,
p
);
}
// unlock
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): поступил заказ на таймер ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
" "
<<
timeMS
<<
" [мс]
\n
"
;
}
else
// отказ (при timeMS == 0)
{
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): поступил отказ по таймеру ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
endl
;
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
tlst
.
erase
(
std
::
remove_if
(
tlst
.
begin
(),
tlst
.
end
(),
Timer_eq
(
timerid
)),
tlst
.
end
()
);
}
// unlock
}
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
if
(
tlst
.
empty
()
)
sleepTime
=
UniSetTimer
::
WaitUpTime
;
else
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
}
return
sleepTime
;
if
(
timeMS
>
0
)
// заказ
{
if
(
timeMS
<
UniSetTimer
::
MinQuantityTime
)
{
ucrit
<<
"(LT_askTimer): [мс] попытка заказать таймер "
<<
getTimerName
(
timerid
)
<<
" со временем срабатывания "
<<
" меньше разрешённого "
<<
UniSetTimer
::
MinQuantityTime
<<
endl
;
timeMS
=
UniSetTimer
::
MinQuantityTime
;
}
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
// поищем а может уж такой есть
if
(
!
tlst
.
empty
()
)
{
for
(
auto
li
=
tlst
.
begin
();
li
!=
tlst
.
end
();
++
li
)
{
if
(
li
->
id
==
timerid
)
{
li
->
curTick
=
ticks
;
li
->
tmr
.
setTiming
(
timeMS
);
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): заказ на таймер ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
" "
<<
timeMS
<<
" [мс] уже есть..."
<<
endl
;
return
sleepTime
;
}
}
}
// TimerInfo newti(timerid, timeMS, ticks, p);
tlst
.
emplace_back
(
timerid
,
timeMS
,
ticks
,
p
);
}
// unlock
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): поступил заказ на таймер ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
" "
<<
timeMS
<<
" [мс]
\n
"
;
}
else
// отказ (при timeMS == 0)
{
if
(
ulog
()
->
debugging
(
loglevel
)
)
ulog
()
->
debug
(
loglevel
)
<<
"(LT_askTimer): поступил отказ по таймеру ["
<<
timerid
<<
"]"
<<
getTimerName
(
timerid
)
<<
endl
;
{
// lock
uniset_rwmutex_wrlock
lock
(
lstMutex
);
tlst
.
erase
(
std
::
remove_if
(
tlst
.
begin
(),
tlst
.
end
(),
Timer_eq
(
timerid
)),
tlst
.
end
()
);
}
// unlock
}
{
// lock
uniset_rwmutex_rlock
lock
(
lstMutex
);
if
(
tlst
.
empty
()
)
sleepTime
=
UniSetTimer
::
WaitUpTime
;
else
sleepTime
=
UniSetTimer
::
MinQuantityTime
;
}
return
sleepTime
;
}
// -----------------------------------------------------------------------------
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