diff options
author | orwell96 <orwell@bleipb.de> | 2019-11-21 14:59:39 +0100 |
---|---|---|
committer | orwell96 <orwell@bleipb.de> | 2019-11-21 16:02:32 +0100 |
commit | 576365627a6ed8ba3fede9de1dce675a94747e48 (patch) | |
tree | b8688c875cbec8c133066d8ca5d2800a2a919819 | |
parent | 8c55442076c9d5cfed89bac3f4acd22ea7948dd3 (diff) | |
download | advtrains-576365627a6ed8ba3fede9de1dce675a94747e48.tar.gz advtrains-576365627a6ed8ba3fede9de1dce675a94747e48.tar.bz2 advtrains-576365627a6ed8ba3fede9de1dce675a94747e48.zip |
Fix scheduler crash (H#133)
for loops don't work with manipulating i
-rw-r--r-- | advtrains_line_automation/scheduler.lua | 8 | ||||
-rw-r--r-- | advtrains_luaautomation/active_common.lua | 4 |
2 files changed, 7 insertions, 5 deletions
diff --git a/advtrains_line_automation/scheduler.lua b/advtrains_line_automation/scheduler.lua index 3d8778a..8afaa55 100644 --- a/advtrains_line_automation/scheduler.lua +++ b/advtrains_line_automation/scheduler.lua @@ -90,7 +90,7 @@ function sched.enqueue(rwtime, handler, evtdata, unitid, unitlim) ucn = (units_cnt[unitid] or 0) local ulim=(unitlim or UNITS_THRESH) if ucn >= ulim then - atwarn("[lines][scheduler] discarding enqueue for",handler,"(limit",ulim,") because unit",unitid,"has already",ucn,"schedules enqueued") + atlog("[lines][scheduler] discarding enqueue for",handler,"(limit",ulim,") because unit",unitid,"has already",ucn,"schedules enqueued") return false end @@ -118,10 +118,12 @@ end -- Discards all schedules for unit "unitid" (removes them from the queue) function sched.discard_all(unitid) - for i=1,#queue do + local i = 1 + while i<=#queue do if queue[i].u == unitid then table.remove(queue,i) - i=i-1 + else + i=i+1 end end units_cnt[unitid] = 0 diff --git a/advtrains_luaautomation/active_common.lua b/advtrains_luaautomation/active_common.lua index 3dc018d..c17c6e9 100644 --- a/advtrains_luaautomation/active_common.lua +++ b/advtrains_luaautomation/active_common.lua @@ -131,10 +131,10 @@ function ac.run_in_env(pos, evtdata, customfct_p) -- add lines scheduler if enabled if advtrains.lines and advtrains.lines.sched then customfct.schedule = function(rwtime, msg) - advtrains.lines.sched.enqueue(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1) + return advtrains.lines.sched.enqueue(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1) end customfct.schedule_in = function(rwtime, msg) - advtrains.lines.sched.enqueue_in(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1) + return advtrains.lines.sched.enqueue_in(rwtime, "atlatc_env", {pos=pos, msg=msg}, advtrains.encode_pos(pos), 1) end end |