sPhone/src/apis/proc.lua

58 lines
1.2 KiB
Lua
Raw Normal View History

2016-10-14 15:05:56 +02:00
-- "multitasking"
local _proc = {}
local _killProc = {}
function signal(pid, sig)
local p = _proc[pid]
if p then
if not p.filter or p.filter == "signal" then
local ok, rtn = coroutine.resume(p.co, "signal", tostring(sig))
if ok then
p.filter = rtn
end
end
return true
end
return false
end
function kill(pid)
_killProc[pid] = true
end
function launch(fn, name)
_proc[#_proc + 1] = {
name = name or "lua",
co = coroutine.create(setfenv(fn, getfenv())),
}
return true
end
function getInfo()
local t = {}
for pid, v in pairs(_proc) do
t[pid] = v.name
end
return t
end
function run()
os.queueEvent("multitask")
while _proc[1] ~= nil do
local ev = {os.pullEventRaw()}
for pid, v in pairs(_proc) do
if not v.filter or ev[1] == "terminate" or v.filter == ev[1] then
local ok, rtn = coroutine.resume(v.co, unpack(ev))
if ok then
v.filter = rtn
end
end
if coroutine.status(v.co) == "dead" then
_killProc[pid] = true
end
end
for pid in pairs(_killProc) do
_proc[pid] = nil
end
if next(_killProc) then
_killProc = {}
end
end
end