mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2025-12-22 17:45:28 +01:00
[Profnsched] New module (fr)
* Objectif principal : maintenir le temps d'exécution du pas (step) au plus près du tick rate (dedicated_server_step) * analyser en temps réel les temps d'execution de certaines fonctions de module (actuellement uniquement globalstep et minetest.after) * Décaler, de façon adaptative, l'exécution des modules qui l'autorisent explicitement en cas de surcharge ... see README for more !
This commit is contained in:
83
mods/profnsched/queue.lua
Normal file
83
mods/profnsched/queue.lua
Normal file
@@ -0,0 +1,83 @@
|
||||
scheduler = {}
|
||||
scheduler.queue = {[1]={first=1, last=2, groups={[1]={}, [2]={}}}}
|
||||
|
||||
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]={}}}
|
||||
p = p-1
|
||||
class = scheduler.queue[p]
|
||||
end
|
||||
class = scheduler.queue[priority]
|
||||
-- get last group
|
||||
local grp = class.groups[class.last]
|
||||
-- add job into last group
|
||||
grp[#grp+1] = job
|
||||
end
|
||||
|
||||
function scheduler.asap(priority, func)
|
||||
scheduler.add(priority, {
|
||||
mod_name = core.get_last_run_mod(),
|
||||
func_id = "todo",
|
||||
func_code = func,
|
||||
arg = {},
|
||||
})
|
||||
end
|
||||
|
||||
function scheduler.mdebug(s)
|
||||
minetest.debug("[Profnsched] "..s)
|
||||
end
|
||||
|
||||
function scheduler.shift()
|
||||
local nb = scheduler.waitingjobs()
|
||||
local tsrc = nil
|
||||
local tdst = nil
|
||||
for class,q in ipairs(scheduler.queue) do
|
||||
q.groups[q.first] = q.groups[q.last]
|
||||
q.groups[q.last] = {}
|
||||
local tnext = class+1
|
||||
tnext = scheduler.queue[tnext]
|
||||
if tnext then
|
||||
tsrc = tnext.groups[tnext.first]
|
||||
tdst = q.groups[q.first]
|
||||
for i,j in pairs(tsrc) do
|
||||
tdst[#tdst+1] = j
|
||||
tsrc[i] = nil
|
||||
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
|
||||
--
|
||||
end
|
||||
|
||||
function scheduler.fulldebug()
|
||||
minetest.log("[Profnsched]"..table.getn(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
|
||||
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
|
||||
end
|
||||
end
|
||||
return n
|
||||
end
|
||||
Reference in New Issue
Block a user