1
1
mirror of https://git.shadowkat.net/izaya/OC-PsychOS2.git synced 2024-11-28 21:55:37 -05:00
OC-PsychOS2/module/sched.lua

78 lines
2.0 KiB
Lua
Raw Normal View History

do
local tTasks,nPid,nTimeout,cPid = {},1,0.25,0 -- table of tasks, next process ID, event timeout, current PID
function os.spawn(f,n) -- function string -- number -- creates a process from function *f* with name *n*
2019-10-27 08:34:02 -04:00
tTasks[nPid] = {
c=coroutine.create(function()
local rt = {pcall(f)}
if not rt[1] then
syslog(rt[2])
end
computer.pushSignal("process_finished",os.pid(),table.unpack(rt))
end), -- actual coroutine
2019-10-27 08:34:02 -04:00
n=n, -- process name
p=nPid, -- process PID
P=cPid, -- parent PID
e={} -- environment variables
}
if tTasks[cPid] then
for k,v in pairs(tTasks[cPid].e) do
tTasks[nPid].e[k] = tTasks[nPid].e[k] or v
end
2018-11-02 12:05:41 -04:00
end
nPid = nPid + 1
return nPid - 1
end
function os.kill(pid) -- number -- -- removes process *pid* from the task list
tTasks[pid] = nil
end
function os.pid() -- -- number -- returns the current process' PID
2019-10-27 08:34:02 -04:00
return cPid
end
function os.tasks() -- -- table -- returns a table of process IDs
2019-10-27 08:34:02 -04:00
local rt = {}
for k,v in pairs(tTasks) do
rt[#rt+1] = k
end
return rt
end
function os.taskInfo(pid) -- number -- table -- returns info on process *pid* as a table with name and parent values
pid = pid or os.pid()
if not tTasks[pid] then return false end
2019-10-27 08:34:02 -04:00
return {name=tTasks[pid].n,parent=tTasks[pid].P}
end
function os.sched() -- the actual scheduler function
os.sched = nil
2018-11-02 12:05:41 -04:00
while #tTasks > 0 do
local tEv = {computer.pullSignal(nTimeout)}
for k,v in pairs(tTasks) do
if coroutine.status(v.c) ~= "dead" then
cPid = k
coroutine.resume(v.c,table.unpack(tEv))
else
tTasks[k] = nil
end
end
end
end
function os.setenv(k,v) -- set's the current process' environment variable *k* to *v*, which is passed to children
if tTasks[cPid] then
tTasks[cPid].e[k] = v
end
end
function os.getenv(k) -- gets a process' *k* environment variable
if tTasks[cPid] then
return tTasks[cPid].e[k]
end
end
function os.getTimeout()
return nTimeout
end
function os.setTimeout(n)
if type(n) == "number" and n >= 0 then
nTimeout = n
return true
end
return false
end
end