aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Christian Hesse <mail@eworm.de>2021-07-08 20:57:53 +0200
committerGravatar Christian Hesse <mail@eworm.de>2021-07-08 21:03:31 +0200
commita4e548eb809664208f55318ac033b68e2381c6cf (patch)
tree909ed1c88d460326b5294674d70b86683a4291fb
parent6c9f733d9623d0c774b3d62a1161ea56d2cae181 (diff)
global-functions: $ScriptLock: make ticket management more reliable
-rw-r--r--global-functions37
1 files changed, 27 insertions, 10 deletions
diff --git a/global-functions b/global-functions
index d11f8e2..6af914f 100644
--- a/global-functions
+++ b/global-functions
@@ -918,17 +918,34 @@
}
: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 Return [ :toarray "" ];
- :foreach Ticket in=$1 do={
- :if ($Ticket != $2) do={
- :set Return ($Return, $Ticket);
+ :local Script [ :tostr $1 ];
+ :local Remove [ :tostr $2 ];
+
+ :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={
@@ -945,10 +962,10 @@
$LogPrintExit2 error $0 ("More tickets than running scripts '" . $Script . "', resetting!") false;
:set ($ScriptLockOrder->$Script);
/ system script job remove [ find where script=$Script ];
- }
+ }
:local MyTicket [ $GetRandom20CharHex ];
- :set ($ScriptLockOrder->$Script) [ $AddTicket ($ScriptLockOrder->$Script) $MyTicket ];
+ $AddTicket $Script $MyTicket;
:local WaitCount 0;
: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={
- :set ($ScriptLockOrder->$Script) [ $RemoveTicket ($ScriptLockOrder->$Script) $MyTicket ];
+ $RemoveTicket $Script $MyTicket;
:return false;
}
- :set ($ScriptLockOrder->$Script) [ $RemoveTicket ($ScriptLockOrder->$Script) $MyTicket ];
+ $RemoveTicket $Script $MyTicket;
$LogPrintExit2 info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \
" and timed out waiting for lock" "" ] . "... Aborting.") [ $IfThenElse ($DoReturn = true) false true ];
:return true;