From 8a78752659826f7f70efe22265ee599d4416da87 Mon Sep 17 00:00:00 2001 From: Coethium Date: Sat, 29 Oct 2016 16:25:57 +0200 Subject: [PATCH] [Profnsched] lost jobs correction Modified to replace # when we ant to count items in an array. Code currently not cleaned after correction. --- mods/profnsched/after.lua | 10 ++++++- mods/profnsched/init.lua | 13 +++++---- mods/profnsched/queue.lua | 58 +++++++++++++++++++++++++-------------- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/mods/profnsched/after.lua b/mods/profnsched/after.lua index d2a41304..70f5e5fa 100644 --- a/mods/profnsched/after.lua +++ b/mods/profnsched/after.lua @@ -3,15 +3,23 @@ dofile(minetest.get_modpath("profnsched").."/queue.lua") local jobs = {} local scheduler = scheduler +function getnjobs() + return #jobs +end + -- For minetest.after replacement local function check_expired_jobs() local time = core.get_us_time() + local tjobs = {} for i,job in pairs(jobs) do if time >= job.expire then scheduler.add(1, job) - jobs[i] = nil + --jobs[i] = nil + else + tjobs[#tjobs+1] = job end end + jobs = tjobs scheduler.asap(4, check_expired_jobs) end scheduler.asap(4, check_expired_jobs) diff --git a/mods/profnsched/init.lua b/mods/profnsched/init.lua index 21d02fef..5ea060bb 100644 --- a/mods/profnsched/init.lua +++ b/mods/profnsched/init.lua @@ -131,24 +131,26 @@ old_globalstep(function(dtime) local njb = scheduler.waitingjobs() local jbdone = 0 for class,q in ipairs(scheduler.queue) do - local grp = q.groups[q.first] - for i,job in pairs(grp) do + --local grp = q.cur + for i,job in pairs(q.cur) do tbegin = core.get_us_time() core.set_last_run_mod(job.mod_name) job.func_code(unpack(job.arg)) jbdone = jbdone+1 current_durations[#current_durations+1] = {job.mod_name, job.func_id, core.get_us_time()-tbegin} - grp[i] = nil + q.cur[i] = nil if class > 1 and ((core.get_us_time()-launch_dtime) > tick_dtime) then --class 1 fully processed even on overload break end end if ((core.get_us_time()-launch_dtime) > tick_dtime) then break - end + end end + --minetest.debug("[Profnsched] "..scheduler.waitingjobs()+getnjobs()) scheduler.shift() - + --minetest.debug("[Profnsched] "..scheduler.waitingjobs()+getnjobs()) + local elapsed = (core.get_us_time()-launch_dtime) -- update all durations @@ -161,6 +163,7 @@ old_globalstep(function(dtime) if active and dump_delay == 0 then minetest.log("[Profnsched] Overload ! "..mathfloor(elapsed)/1000 .."ms") dump_durations(current_durations) + --scheduler.fulldebug() end else if active and dump_delay == 0 then diff --git a/mods/profnsched/queue.lua b/mods/profnsched/queue.lua index 112bf808..f7846677 100644 --- a/mods/profnsched/queue.lua +++ b/mods/profnsched/queue.lua @@ -1,20 +1,24 @@ scheduler = {} -scheduler.queue = {[1]={first=1, last=2, groups={[1]={}, [2]={}}}} +-- scheduler.queue = {[1]={first=1, last=2, groups={[1]={}, [2]={}}}} +scheduler.queue = {[1]={cur={}, nxt={}, ncur=1, nnxt=1}} function scheduler.add(priority, job) -- get asked class local class = scheduler.queue[priority] local p = priority while not class do -- create all classes under 'priority' - scheduler.queue[p] = {first=1, last=2, groups={[1]={}, [2]={}}} + --scheduler.queue[p] = {first=1, last=2, groups={[1]={}, [2]={}}} + scheduler.queue[p] = {cur={}, nxt={}, ncur=1, nnxt=1} p = p-1 class = scheduler.queue[p] end class = scheduler.queue[priority] + class.nxt[class.nnxt] = job + class.nnxt = class.nnxt+1 -- get last group - local grp = class.groups[class.last] + --local grp = class.groups[class.last] -- add job into last group - grp[#grp+1] = job + --grp[#grp+1] = job end function scheduler.asap(priority, func) @@ -32,9 +36,27 @@ end function scheduler.shift() local nb = scheduler.waitingjobs() - local tsrc = nil - local tdst = nil + local qnext = nil for class,q in ipairs(scheduler.queue) do + q.cur = q.nxt + q.nxt = {} + q.ncur = q.nnxt + q.nnxt = 1 + + --local tnext = class+1 + qnext = scheduler.queue[class+1] + if qnext then + local src = qnext.cur + for i,j in pairs(src) do + q.cur[q.ncur] = j + q.ncur = q.ncur+1 + src[i] = nil + end + qnext.cur = {} + qnext.ncur = 1 + end + end + --[[ q.groups[q.first] = q.groups[q.last] q.groups[q.last] = {} local tnext = class+1 @@ -47,7 +69,7 @@ function scheduler.shift() tsrc[i] = nil end end - end + end]] if nb ~= scheduler.waitingjobs() then --This should never happen, left because it was used during debug phase mdebug("ERROR, This should never happen ! Lost jobs, some mod may not work from now, please restart the server.") end @@ -55,28 +77,24 @@ function scheduler.shift() end function scheduler.fulldebug() - minetest.log("[Profnsched]"..table.getn(scheduler.queue).." classes") + minetest.log("[Profnsched]"..#scheduler.queue.." classes") for class,q in pairs(scheduler.queue) do minetest.log("[Profnsched] class "..class..":") - minetest.log("[Profnsched] "..q.first.." "..q.last.." ("..q.last-q.first+1 .." groups)") - for i,grp in pairs(q.groups) do - local n = 0 - for j,jb in pairs(grp) do - n = n+1 - end - minetest.log("[Profnsched] group "..i..", "..n.." jobs") - end + minetest.log("[Profnsched] current "..q.ncur) + minetest.log("[Profnsched] next "..q.nnxt) end minetest.log("[Profnsched] end") end + function scheduler.waitingjobs() local n = 0 for class, q in pairs(scheduler.queue) do - for i,grp in pairs(q.groups) do - for j,jb in pairs(grp) do - n = n+1 - end + for i,grp in pairs(q.cur) do + n = n+1 + end + for i,grp in pairs(q.nxt) do + n = n+1 end end return n