Skip to content
This repository was archived by the owner on Aug 20, 2020. It is now read-only.

Commit 8a78752

Browse files
committed
[Profnsched] lost jobs correction
Modified to replace # when we ant to count items in an array. Code currently not cleaned after correction.
1 parent 7ddebdd commit 8a78752

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

mods/profnsched/after.lua

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@ dofile(minetest.get_modpath("profnsched").."/queue.lua")
33
local jobs = {}
44
local scheduler = scheduler
55

6+
function getnjobs()
7+
return #jobs
8+
end
9+
610
-- For minetest.after replacement
711
local function check_expired_jobs()
812
local time = core.get_us_time()
13+
local tjobs = {}
914
for i,job in pairs(jobs) do
1015
if time >= job.expire then
1116
scheduler.add(1, job)
12-
jobs[i] = nil
17+
--jobs[i] = nil
18+
else
19+
tjobs[#tjobs+1] = job
1320
end
1421
end
22+
jobs = tjobs
1523
scheduler.asap(4, check_expired_jobs)
1624
end
1725
scheduler.asap(4, check_expired_jobs)

mods/profnsched/init.lua

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,24 +131,26 @@ old_globalstep(function(dtime)
131131
local njb = scheduler.waitingjobs()
132132
local jbdone = 0
133133
for class,q in ipairs(scheduler.queue) do
134-
local grp = q.groups[q.first]
135-
for i,job in pairs(grp) do
134+
--local grp = q.cur
135+
for i,job in pairs(q.cur) do
136136
tbegin = core.get_us_time()
137137
core.set_last_run_mod(job.mod_name)
138138
job.func_code(unpack(job.arg))
139139
jbdone = jbdone+1
140140
current_durations[#current_durations+1] = {job.mod_name, job.func_id, core.get_us_time()-tbegin}
141-
grp[i] = nil
141+
q.cur[i] = nil
142142
if class > 1 and ((core.get_us_time()-launch_dtime) > tick_dtime) then --class 1 fully processed even on overload
143143
break
144144
end
145145
end
146146
if ((core.get_us_time()-launch_dtime) > tick_dtime) then
147147
break
148-
end
148+
end
149149
end
150+
--minetest.debug("[Profnsched] "..scheduler.waitingjobs()+getnjobs())
150151
scheduler.shift()
151-
152+
--minetest.debug("[Profnsched] "..scheduler.waitingjobs()+getnjobs())
153+
152154
local elapsed = (core.get_us_time()-launch_dtime)
153155

154156
-- update all durations
@@ -161,6 +163,7 @@ old_globalstep(function(dtime)
161163
if active and dump_delay == 0 then
162164
minetest.log("[Profnsched] Overload ! "..mathfloor(elapsed)/1000 .."ms")
163165
dump_durations(current_durations)
166+
--scheduler.fulldebug()
164167
end
165168
else
166169
if active and dump_delay == 0 then

mods/profnsched/queue.lua

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
scheduler = {}
2-
scheduler.queue = {[1]={first=1, last=2, groups={[1]={}, [2]={}}}}
2+
-- scheduler.queue = {[1]={first=1, last=2, groups={[1]={}, [2]={}}}}
3+
scheduler.queue = {[1]={cur={}, nxt={}, ncur=1, nnxt=1}}
34

45
function scheduler.add(priority, job)
56
-- get asked class
67
local class = scheduler.queue[priority]
78
local p = priority
89
while not class do -- create all classes under 'priority'
9-
scheduler.queue[p] = {first=1, last=2, groups={[1]={}, [2]={}}}
10+
--scheduler.queue[p] = {first=1, last=2, groups={[1]={}, [2]={}}}
11+
scheduler.queue[p] = {cur={}, nxt={}, ncur=1, nnxt=1}
1012
p = p-1
1113
class = scheduler.queue[p]
1214
end
1315
class = scheduler.queue[priority]
16+
class.nxt[class.nnxt] = job
17+
class.nnxt = class.nnxt+1
1418
-- get last group
15-
local grp = class.groups[class.last]
19+
--local grp = class.groups[class.last]
1620
-- add job into last group
17-
grp[#grp+1] = job
21+
--grp[#grp+1] = job
1822
end
1923

2024
function scheduler.asap(priority, func)
@@ -32,9 +36,27 @@ end
3236

3337
function scheduler.shift()
3438
local nb = scheduler.waitingjobs()
35-
local tsrc = nil
36-
local tdst = nil
39+
local qnext = nil
3740
for class,q in ipairs(scheduler.queue) do
41+
q.cur = q.nxt
42+
q.nxt = {}
43+
q.ncur = q.nnxt
44+
q.nnxt = 1
45+
46+
--local tnext = class+1
47+
qnext = scheduler.queue[class+1]
48+
if qnext then
49+
local src = qnext.cur
50+
for i,j in pairs(src) do
51+
q.cur[q.ncur] = j
52+
q.ncur = q.ncur+1
53+
src[i] = nil
54+
end
55+
qnext.cur = {}
56+
qnext.ncur = 1
57+
end
58+
end
59+
--[[
3860
q.groups[q.first] = q.groups[q.last]
3961
q.groups[q.last] = {}
4062
local tnext = class+1
@@ -47,36 +69,32 @@ function scheduler.shift()
4769
tsrc[i] = nil
4870
end
4971
end
50-
end
72+
end]]
5173
if nb ~= scheduler.waitingjobs() then --This should never happen, left because it was used during debug phase
5274
mdebug("ERROR, This should never happen ! Lost jobs, some mod may not work from now, please restart the server.")
5375
end
5476
--
5577
end
5678

5779
function scheduler.fulldebug()
58-
minetest.log("[Profnsched]"..table.getn(scheduler.queue).." classes")
80+
minetest.log("[Profnsched]"..#scheduler.queue.." classes")
5981
for class,q in pairs(scheduler.queue) do
6082
minetest.log("[Profnsched] class "..class..":")
61-
minetest.log("[Profnsched] "..q.first.." "..q.last.." ("..q.last-q.first+1 .." groups)")
62-
for i,grp in pairs(q.groups) do
63-
local n = 0
64-
for j,jb in pairs(grp) do
65-
n = n+1
66-
end
67-
minetest.log("[Profnsched] group "..i..", "..n.." jobs")
68-
end
83+
minetest.log("[Profnsched] current "..q.ncur)
84+
minetest.log("[Profnsched] next "..q.nnxt)
6985
end
7086
minetest.log("[Profnsched] end")
7187
end
7288

89+
7390
function scheduler.waitingjobs()
7491
local n = 0
7592
for class, q in pairs(scheduler.queue) do
76-
for i,grp in pairs(q.groups) do
77-
for j,jb in pairs(grp) do
78-
n = n+1
79-
end
93+
for i,grp in pairs(q.cur) do
94+
n = n+1
95+
end
96+
for i,grp in pairs(q.nxt) do
97+
n = n+1
8098
end
8199
end
82100
return n

0 commit comments

Comments
 (0)