11scheduler = {}
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
45function 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
1822end
1923
2024function scheduler .asap (priority , func )
3236
3337function 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 --
5577end
5678
5779function 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" )
7187end
7288
89+
7390function 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