From 576365627a6ed8ba3fede9de1dce675a94747e48 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 21 Nov 2019 14:59:39 +0100 Subject: Fix scheduler crash (H#133) for loops don't work with manipulating i --- advtrains_line_automation/scheduler.lua | 8 +++++--- 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 -- cgit v1.2.3