-- Advanced process management. Mutates the multi namespace local multi, thread = require("multi"):init() local ok, chronos = pcall(require, "chronos") -- hpc if not ok then chronos = nil end -- This is an integration, we cannot directly access locals that are in the main file. local PList = { multi.Priority_Core, multi.Priority_Very_High, multi.Priority_High, multi.Priority_Above_Normal, multi.Priority_Normal, multi.Priority_Below_Normal, multi.Priority_Low, multi.Priority_Very_Low, multi.Priority_Idle } -- Restructered these functions since they rely on local variables from the core library local mainloop = multi.mainloopRef local mainloop_p = multi.mainloop_p local uManagerRef = multi.uManagerRef local uManagerRefP = multi.uManagerRefP1 -- self:setCurrentProcess() a bit slower than using the local var, but there isn't another option local priorityManager = multi:newProcessor("Priority Manager", true) local function processHook(obj, proc) obj.__restoreProc = proc obj:reallocate(priorityManager) end local function init() local RR, PB, TB = 0, 1, 2 multi.priorityScheme = { RoundRobin = 0, PriorityBased = 1, TimedBased = 2 } function multi:setPriorityScheme(scheme) if not self.Type == multi.PROCESS or not self.Type == multi.ROOTPROCESS then multi.warn("You should only invoke setPriorityScheme on a processor object!") end if scheme == RR then multi.mainloop = mainloop multi.uManager = uManagerRef elseif scheme == PB then multi.mainloop = mainloop_p multi.uManager = uManagerRefP elseif scheme == TB then -- else multi.error("Invalid priority scheme passed!") end end end local function init_chronos() multi:newThread("Priority Manager", function() while true do thread.yield() priorityManager.run() end end) end if chronos then init_chronos() else multi.print("In order to have time based priority management, you need to install the chronos library!") end init() --chronos.nanotime()