mirror of
https://github.com/eworm-de/routeros-scripts
synced 2024-05-14 08:04:19 +00:00
global-functions: $ScriptLock: make ticket management more reliable
This commit is contained in:
parent
6c9f733d96
commit
a4e548eb80
1 changed files with 27 additions and 10 deletions
|
@ -918,17 +918,34 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:local AddTicket do={
|
:local AddTicket do={
|
||||||
:return ($1, $2);
|
:local Script [ :tostr $1 ];
|
||||||
|
:local Add [ :tostr $2 ];
|
||||||
|
|
||||||
|
:global ScriptLockOrder;
|
||||||
|
|
||||||
|
:local Ok false;
|
||||||
|
:while ($Ok = false) do={
|
||||||
|
:set ($ScriptLockOrder->$Script) (($ScriptLockOrder->$Script), $Add);
|
||||||
|
:delay 10ms;
|
||||||
|
:foreach Ticket in=($ScriptLockOrder->$Script) do={
|
||||||
|
:if ($Ticket = $Add) do={ :set Ok true; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:local RemoveTicket do={
|
:local RemoveTicket do={
|
||||||
:local Return [ :toarray "" ];
|
:local Script [ :tostr $1 ];
|
||||||
:foreach Ticket in=$1 do={
|
:local Remove [ :tostr $2 ];
|
||||||
:if ($Ticket != $2) do={
|
|
||||||
:set Return ($Return, $Ticket);
|
:global ScriptLockOrder;
|
||||||
|
|
||||||
|
:local New [ :toarray "" ];
|
||||||
|
:foreach Ticket in=($ScriptLockOrder->$Script) do={
|
||||||
|
:if ($Ticket != $Remove) do={
|
||||||
|
:set New ($New, $Ticket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
:return $Return;
|
:set ($ScriptLockOrder->$Script) $New;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ :len [ / system script find where name=$Script ] ] = 0) do={
|
:if ([ :len [ / system script find where name=$Script ] ] = 0) do={
|
||||||
|
@ -948,7 +965,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:local MyTicket [ $GetRandom20CharHex ];
|
:local MyTicket [ $GetRandom20CharHex ];
|
||||||
:set ($ScriptLockOrder->$Script) [ $AddTicket ($ScriptLockOrder->$Script) $MyTicket ];
|
$AddTicket $Script $MyTicket;
|
||||||
|
|
||||||
:local WaitCount 0;
|
:local WaitCount 0;
|
||||||
:while ($WaitMax > $WaitCount && (($ScriptLockOrder->$Script->0) != $MyTicket || [ :len ($ScriptLockOrder->$Script) ] < $JobCount)) do={
|
:while ($WaitMax > $WaitCount && (($ScriptLockOrder->$Script->0) != $MyTicket || [ :len ($ScriptLockOrder->$Script) ] < $JobCount)) do={
|
||||||
|
@ -958,11 +975,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ :len ($ScriptLockOrder->$Script) ] = $JobCount && ($ScriptLockOrder->$Script->0) = $MyTicket) do={
|
:if ([ :len ($ScriptLockOrder->$Script) ] = $JobCount && ($ScriptLockOrder->$Script->0) = $MyTicket) do={
|
||||||
:set ($ScriptLockOrder->$Script) [ $RemoveTicket ($ScriptLockOrder->$Script) $MyTicket ];
|
$RemoveTicket $Script $MyTicket;
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
:set ($ScriptLockOrder->$Script) [ $RemoveTicket ($ScriptLockOrder->$Script) $MyTicket ];
|
$RemoveTicket $Script $MyTicket;
|
||||||
$LogPrintExit2 info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \
|
$LogPrintExit2 info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \
|
||||||
" and timed out waiting for lock" "" ] . "... Aborting.") [ $IfThenElse ($DoReturn = true) false true ];
|
" and timed out waiting for lock" "" ] . "... Aborting.") [ $IfThenElse ($DoReturn = true) false true ];
|
||||||
:return true;
|
:return true;
|
||||||
|
|
Loading…
Reference in a new issue