made stuff more verbose
and also fixed modload using an outdated variant of the log library
This commit is contained in:
+48
-40
@@ -8,50 +8,58 @@ local modules = {}
|
|||||||
local moduleTypes = {}
|
local moduleTypes = {}
|
||||||
|
|
||||||
local function loadModule(modName)
|
local function loadModule(modName)
|
||||||
local moduleData = modules[modName]
|
local moduleData = modules[modName]
|
||||||
table.remove(moduleList, table.find(moduleList, modName))
|
table.remove(moduleList, table.find(moduleList, modName))
|
||||||
if not moduleData then return end
|
if not moduleData then
|
||||||
if not moduleData.check() then
|
log.kernel.warn(string.format("[modload: %s] Could not find module data.", modName))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if moduleData.dependencies then
|
if not moduleData.check() then
|
||||||
for _, dependency in pairs(moduleData.dependencies) do
|
log.kernel.info(string.format("[modload: %s] Module not ready - skipping", modName))
|
||||||
if table.find(moduleList, dependency) then
|
return
|
||||||
loadModule(dependency)
|
end
|
||||||
elseif table.find(moduleList, dependency .. ".lua") then
|
if moduleData.dependencies then
|
||||||
loadModule(dependency .. ".lua")
|
for _, dependency in pairs(moduleData.dependencies) do
|
||||||
else
|
if table.find(moduleList, dependency) then
|
||||||
for typeLookupDrvName, typeLookupDrvType in pairs(moduleTypes) do
|
loadModule(dependency)
|
||||||
if typeLookupDrvType == dependency then
|
elseif table.find(moduleList, dependency .. ".lua") then
|
||||||
loadModule(typeLookupDrvName)
|
loadModule(dependency .. ".lua")
|
||||||
-- Don't break, because there can be multiple modules of the correct type
|
else
|
||||||
end
|
for typeLookupDrvName, typeLookupDrvType in pairs(moduleTypes) do
|
||||||
end
|
if typeLookupDrvType == dependency then
|
||||||
end
|
loadModule(typeLookupDrvName)
|
||||||
end
|
-- Don't break, because there can be multiple modules of the correct type
|
||||||
end
|
end
|
||||||
--print(modName)
|
end
|
||||||
if moduleData.init then -- I have no idea why this would not exist, but it's a failsafe
|
end
|
||||||
moduleData.init()
|
end
|
||||||
end
|
end
|
||||||
|
--print(modName)
|
||||||
|
log.kernel.info(string.format("[modload: %s] Loading module", modName))
|
||||||
|
if moduleData.init then -- I have no idea why this would not exist, but it's a failsafe
|
||||||
|
moduleData.init()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, modName in pairs(moduleList) do -- Get all the module types
|
for _, modName in pairs(moduleList) do -- Get all the module types
|
||||||
local moduleData = require(fs.concat(modulePath, modName)) -- TODO: Make this not actually throw an error, rather put something in the log and move on
|
log.kernel.info(string.format("[modload: %s] Getting data from module", modName))
|
||||||
if type(moduleData)~="table" then
|
local moduleData = require(fs.concat(modulePath, modName)) -- TODO: Make this not actually throw an error, rather put something in the log and move on
|
||||||
log.add(string.format("[modload: %s] Module returned invalid type (%s) - skipping",modName,type(moduleData)),"error")
|
if type(moduleData) ~= "table" then
|
||||||
goto continue
|
log.kernel.error(
|
||||||
end
|
string.format("[modload: %s] Module returned invalid type (%s) - skipping", modName, type(moduleData))
|
||||||
modules[modName]=moduleData
|
)
|
||||||
if moduleData.type then
|
goto continue
|
||||||
--print(moduleData.type)
|
end
|
||||||
moduleTypes[modName] = moduleData.type -- Not the other way around because there can be multiple modules of the same type, but there can't be multiple entries with the same key
|
modules[modName] = moduleData
|
||||||
end
|
if moduleData.type then
|
||||||
::continue::
|
--print(moduleData.type)
|
||||||
|
moduleTypes[modName] = moduleData.type -- Not the other way around because there can be multiple modules of the same type, but there can't be multiple entries with the same key
|
||||||
|
end
|
||||||
|
::continue::
|
||||||
end
|
end
|
||||||
|
|
||||||
while moduleList[1] do
|
while moduleList[1] do
|
||||||
if moduleList[1]:sub(-1, -1) ~= "/" then -- Check if it's not a directory. If it is, it might be module config
|
if moduleList[1]:sub(-1, -1) ~= "/" then -- Check if it's not a directory. If it is, it might be module config
|
||||||
loadModule(moduleList[1])
|
loadModule(moduleList[1])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+122
-119
@@ -14,136 +14,139 @@ local gpu = component.gpu
|
|||||||
local log = require("log")
|
local log = require("log")
|
||||||
|
|
||||||
function _G._PUBLIC.tsched.runAsTask(path, ...)
|
function _G._PUBLIC.tsched.runAsTask(path, ...)
|
||||||
local args = { ... }
|
local args = { ... }
|
||||||
local function taskFunction()
|
local function taskFunction()
|
||||||
local result, errorMessage = xpcall(function(...)
|
local result, errorMessage = xpcall(function(...)
|
||||||
local args = table.pack(...)
|
local args = table.pack(...)
|
||||||
if not filesystem.exists(path) then
|
if not filesystem.exists(path) then
|
||||||
error("No such file: " .. path)
|
error("No such file: " .. path)
|
||||||
end
|
end
|
||||||
local handle, data, tmpdata = filesystem.open(path), "", nil
|
local handle, data, tmpdata = filesystem.open(path), "", nil
|
||||||
repeat
|
repeat
|
||||||
tmpdata = handle:read(math.huge or math.maxinteger)
|
tmpdata = handle:read(math.huge or math.maxinteger)
|
||||||
data = data .. (tmpdata or "")
|
data = data .. (tmpdata or "")
|
||||||
until not tmpdata
|
until not tmpdata
|
||||||
handle:close()
|
handle:close()
|
||||||
|
|
||||||
-- Userland environment definition
|
-- Userland environment definition
|
||||||
local userland = table.copy(_PUBLIC)
|
local userland = table.copy(_PUBLIC)
|
||||||
userland._G = userland
|
userland._G = userland
|
||||||
userland.load = function(chunk, chunkname, mode, env)
|
userland.load = function(chunk, chunkname, mode, env)
|
||||||
if not env or env == _G then env = userland end -- if they SOMEHOW get the kernel environment they're not running jack shit
|
if not env or env == _G then
|
||||||
return load(chunk, chunkname, mode, env)
|
env = userland
|
||||||
end
|
end -- if they SOMEHOW get the kernel environment they're not running jack shit
|
||||||
userland.require = reqgen(userland.load)
|
return load(chunk, chunkname, mode, env)
|
||||||
|
end
|
||||||
|
userland.require = reqgen(userland.load)
|
||||||
|
|
||||||
assert(load(data, "=" .. path, "t", userland))(table.unpack(args))
|
assert(load(data, "=" .. path, "t", userland))(table.unpack(args))
|
||||||
end, function(errorMessage)
|
end, function(errorMessage)
|
||||||
return errorMessage .. "\n \n" .. debug.traceback()
|
return errorMessage .. "\n \n" .. debug.traceback()
|
||||||
end, --[[ path,]] table.unpack(args))
|
end, --[[ path,]] table.unpack(args))
|
||||||
if not result then
|
if not result then
|
||||||
if print then
|
if print then
|
||||||
gpu.freeAllBuffers()
|
gpu.freeAllBuffers()
|
||||||
print("\n\27[91m" .. errorMessage)
|
print("\n\27[91m" .. errorMessage)
|
||||||
else
|
else
|
||||||
error(errorMessage)
|
error(errorMessage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--require(path, table.unpack(args))
|
--require(path, table.unpack(args))
|
||||||
end
|
end
|
||||||
local _, taskInfo = _PUBLIC.tsched.addTask(taskFunction, string.match(tostring(path), "([^/]+)%.lua$"))
|
local _, taskInfo = _PUBLIC.tsched.addTask(taskFunction, string.match(tostring(path), "([^/]+)%.lua$"))
|
||||||
taskInfo.path = path
|
taskInfo.path = path
|
||||||
taskInfo.args = table.copy(args)
|
taskInfo.args = table.copy(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
function _G._PUBLIC.tsched.addTask(func, name)
|
function _G._PUBLIC.tsched.addTask(func, name)
|
||||||
local task = coroutine.create(func)
|
local task = coroutine.create(func)
|
||||||
local taskInfo = { ["task"] = task, ["name"] = name, ["id"] = idCounter }
|
local taskInfo = { ["task"] = task, ["name"] = name, ["id"] = idCounter }
|
||||||
if currentTask and type(currentTask.id) == "number" then
|
if currentTask and type(currentTask.id) == "number" then
|
||||||
taskInfo.parent = currentTask.id
|
taskInfo.parent = currentTask.id
|
||||||
end
|
end
|
||||||
table.insert(tsched.tasks, taskInfo)
|
table.insert(tsched.tasks, taskInfo)
|
||||||
idCounter = idCounter + 1
|
idCounter = idCounter + 1
|
||||||
if taskInfo.parent then
|
if taskInfo.parent then
|
||||||
log.kernel.info("Created task " .. name .. " with PID " .. idCounter - 1 .. " by parent with PID " .. taskInfo
|
log.kernel.info(
|
||||||
.parent)
|
"Created task " .. name .. " with PID " .. idCounter - 1 .. " by parent with PID " .. taskInfo.parent
|
||||||
else
|
)
|
||||||
log.kernel.info("Created task " .. name .. " with PID " .. idCounter - 1 .. " (no parent found)")
|
else
|
||||||
end
|
log.kernel.info("Created task " .. name .. " with PID " .. idCounter - 1 .. " (no parent found)")
|
||||||
return task, taskInfo
|
end
|
||||||
|
return task, taskInfo
|
||||||
end
|
end
|
||||||
|
|
||||||
function _G._PUBLIC.tsched.removeTask(id)
|
function _G._PUBLIC.tsched.removeTask(id)
|
||||||
-- TODO: Check for user permissions before running
|
-- TODO: Check for user permissions before running
|
||||||
for index, task in pairs(tsched.tasks) do
|
for index, task in pairs(tsched.tasks) do
|
||||||
if task.id == id then
|
if task.id == id then
|
||||||
table.remove(tsched.tasks, index)
|
table.remove(tsched.tasks, index)
|
||||||
log.kernel.info("Removed task with PID " .. id)
|
log.kernel.info("Removed task with PID " .. id)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
log.kernel.warn("Tried to remove task that doesn't exist - PID " .. id)
|
log.kernel.warn("Tried to remove task that doesn't exist - PID " .. id)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function handleError(errormsg)
|
function handleError(errormsg)
|
||||||
if errormsg == nil then -- TODO: Replace with proper error handling
|
if errormsg == nil then -- TODO: Replace with proper error handling
|
||||||
print("\27[91munknown error" .. "\n \n" .. debug.traceback())
|
print("\27[91munknown error" .. "\n \n" .. debug.traceback())
|
||||||
else
|
else
|
||||||
print("\27[91m" .. tostring(errormsg) .. "\n \n" .. debug.traceback())
|
print("\27[91m" .. tostring(errormsg) .. "\n \n" .. debug.traceback())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function runTasks()
|
local function runTasks()
|
||||||
for i = 1, #_G.tsched.tasks do
|
for i = 1, #_G.tsched.tasks do
|
||||||
if tsched.tasks[i] then
|
if tsched.tasks[i] then
|
||||||
currentTask = tsched.tasks[i]
|
currentTask = tsched.tasks[i]
|
||||||
local result, errorMessage = coroutine.resume(tsched.tasks[i].task)
|
local result, errorMessage = coroutine.resume(tsched.tasks[i].task)
|
||||||
if not result then
|
if not result then
|
||||||
handleError(errorMessage)
|
handleError(errorMessage)
|
||||||
end
|
end
|
||||||
if coroutine.status(tsched.tasks[i].task) == "dead" then
|
if coroutine.status(tsched.tasks[i].task) == "dead" then
|
||||||
_PUBLIC.tsched.removeTask(tsched.tasks[i].id)
|
_PUBLIC.tsched.removeTask(tsched.tasks[i].id)
|
||||||
--ocelot.log("Removed coroutine")
|
--ocelot.log("Removed coroutine")
|
||||||
i = i - 1
|
i = i - 1
|
||||||
end
|
end
|
||||||
--computer.pullSignal(0)
|
--computer.pullSignal(0)
|
||||||
--coroutine.yield()
|
--coroutine.yield()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function _G._PUBLIC.tsched.getCurrentTask()
|
function _G._PUBLIC.tsched.getCurrentTask()
|
||||||
return table.copy(currentTask)
|
return table.copy(currentTask)
|
||||||
end
|
end
|
||||||
|
|
||||||
function _G._PUBLIC.tsched.getTasks()
|
function _G._PUBLIC.tsched.getTasks()
|
||||||
return table.copy(tsched.tasks)
|
return table.copy(tsched.tasks)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function taskFunction()
|
local function taskFunction()
|
||||||
local result, errorMessage = xpcall(function()
|
local result, errorMessage = xpcall(function()
|
||||||
if not filesystem.exists("/halyde/kernel/evmgr.lua") then
|
if not filesystem.exists("/halyde/kernel/evmgr.lua") then
|
||||||
error("No such file: /halyde/kernel/evmgr.lua")
|
error("No such file: /halyde/kernel/evmgr.lua")
|
||||||
end
|
end
|
||||||
local handle, data, tmpdata = filesystem.open("/halyde/kernel/evmgr.lua"), "", nil
|
local handle, data, tmpdata = filesystem.open("/halyde/kernel/evmgr.lua"), "", nil
|
||||||
repeat
|
repeat
|
||||||
tmpdata = handle:read(math.huge or math.maxinteger)
|
tmpdata = handle:read(math.huge or math.maxinteger)
|
||||||
data = data .. (tmpdata or "")
|
data = data .. (tmpdata or "")
|
||||||
until not tmpdata
|
until not tmpdata
|
||||||
handle:close()
|
handle:close()
|
||||||
assert(load(data, "=/halyde/kernel/evmgr.lua"))()
|
assert(load(data, "=/halyde/kernel/evmgr.lua"))()
|
||||||
end, function(errorMessage)
|
end, function(errorMessage)
|
||||||
return errorMessage .. "\n \n" .. debug.traceback()
|
return errorMessage .. "\n \n" .. debug.traceback()
|
||||||
end, "/halyde/kernel/evmgr.lua")
|
end, "/halyde/kernel/evmgr.lua")
|
||||||
if not result then
|
if not result then
|
||||||
if print then
|
if print then
|
||||||
gpu.freeAllBuffers()
|
gpu.freeAllBuffers()
|
||||||
print("\n\27[91m" .. errorMessage)
|
print("\n\27[91m" .. errorMessage)
|
||||||
else
|
else
|
||||||
error(errorMessage)
|
error(errorMessage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
_PUBLIC.tsched.addTask(taskFunction, "evmgr")
|
_PUBLIC.tsched.addTask(taskFunction, "evmgr")
|
||||||
package.preload("event")
|
package.preload("event")
|
||||||
@@ -151,26 +154,26 @@ package.preload("event")
|
|||||||
log.kernel.info("Starting startup apps...")
|
log.kernel.info("Starting startup apps...")
|
||||||
local handle, data, tmpdata = filesystem.open("/halyde/config/startupapps.json", "r"), "", nil
|
local handle, data, tmpdata = filesystem.open("/halyde/config/startupapps.json", "r"), "", nil
|
||||||
repeat
|
repeat
|
||||||
tmpdata = handle:read(math.huge or math.maxinteger)
|
tmpdata = handle:read(math.huge or math.maxinteger)
|
||||||
data = data .. (tmpdata or "")
|
data = data .. (tmpdata or "")
|
||||||
until not tmpdata
|
until not tmpdata
|
||||||
handle:close()
|
handle:close()
|
||||||
for _, line in ipairs(json.decode(data)) do
|
for _, line in ipairs(json.decode(data)) do
|
||||||
if line ~= "" then
|
if line ~= "" then
|
||||||
--[[ if _G.print then
|
--[[ if _G.print then
|
||||||
print(line)
|
print(line)
|
||||||
end ]]
|
end ]]
|
||||||
_G._PUBLIC.tsched.runAsTask(line)
|
_G._PUBLIC.tsched.runAsTask(line)
|
||||||
runTasks()
|
runTasks()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- _G.cormgr.loadCoroutine("/halyde/core/shell.lua")
|
-- _G.cormgr.loadCoroutine("/halyde/core/shell.lua")
|
||||||
|
|
||||||
log.setPrintLogs(false)
|
log.setPrintLogs(false)
|
||||||
while true do
|
while true do
|
||||||
runTasks()
|
runTasks()
|
||||||
if #_G.tsched.tasks == 0 then
|
if #_G.tsched.tasks == 0 then
|
||||||
log.kernel.warn("No more tasks left! Shutting down...")
|
log.kernel.warn("No more tasks left! Shutting down...")
|
||||||
computer.shutdown()
|
computer.shutdown()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user