forgot to commit openos
This commit is contained in:
84
data/openos/boot/01_process.lua
Normal file
84
data/openos/boot/01_process.lua
Normal file
@@ -0,0 +1,84 @@
|
||||
local process = require("process")
|
||||
local fs = require("filesystem")
|
||||
|
||||
--Initialize coroutine library--
|
||||
local _coroutine = coroutine -- real coroutine backend
|
||||
|
||||
_G.coroutine = setmetatable(
|
||||
{
|
||||
resume = function(co, ...)
|
||||
local proc = process.info(co)
|
||||
-- proc is nil if the process closed, natural resume will likely complain the coroutine is dead
|
||||
-- but if proc is dead and an orphan coroutine is alive, it doesn't have any proc data like stack info
|
||||
-- if the user really wants to resume it, let them
|
||||
return (proc and proc.data.coroutine_handler.resume or _coroutine.resume)(co, ...)
|
||||
end
|
||||
},
|
||||
{
|
||||
__index = function(_, key)
|
||||
local proc = process.info(_coroutine.running())
|
||||
return (proc and proc.data.coroutine_handler or _coroutine)[key]
|
||||
end
|
||||
}
|
||||
)
|
||||
|
||||
package.loaded.coroutine = _G.coroutine
|
||||
|
||||
local kernel_load = _G.load
|
||||
local intercept_load
|
||||
intercept_load = function(source, label, mode, env)
|
||||
local prev_load = env and env.load or _G.load
|
||||
local e = env and setmetatable({
|
||||
load = function(_source, _label, _mode, _env)
|
||||
return prev_load(_source, _label, _mode, _env or env)
|
||||
end}, {
|
||||
__index = env,
|
||||
__pairs = function(...) return pairs(env, ...) end,
|
||||
__newindex = function(_, key, value) env[key] = value end,
|
||||
})
|
||||
return kernel_load(source, label, mode, e or process.info().env)
|
||||
end
|
||||
_G.load = intercept_load
|
||||
|
||||
local kernel_create = _coroutine.create
|
||||
_coroutine.create = function(f,standAlone)
|
||||
local co = kernel_create(f)
|
||||
if not standAlone then
|
||||
table.insert(process.findProcess().instances, co)
|
||||
end
|
||||
return co
|
||||
end
|
||||
|
||||
_coroutine.wrap = function(f)
|
||||
local thread = coroutine.create(f)
|
||||
return function(...)
|
||||
return select(2, coroutine.resume(thread, ...))
|
||||
end
|
||||
end
|
||||
|
||||
local init_thread = _coroutine.running()
|
||||
process.list[init_thread] = {
|
||||
path = "/init.lua",
|
||||
command = "init",
|
||||
env = _ENV,
|
||||
data =
|
||||
{
|
||||
vars={},
|
||||
handles={},
|
||||
io={}, --init will populate this
|
||||
coroutine_handler = _coroutine,
|
||||
signal = error
|
||||
},
|
||||
instances = setmetatable({}, {__mode="v"})
|
||||
}
|
||||
|
||||
-- intercept fs open
|
||||
local fs_open = fs.open
|
||||
fs.open = function(...)
|
||||
local fs_open_result = table.pack(fs_open(...))
|
||||
if fs_open_result[1] then
|
||||
process.addHandle(fs_open_result[1])
|
||||
end
|
||||
return table.unpack(fs_open_result, 1, fs_open_result.n)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user