made stuff more verbose

and also fixed modload using an outdated variant of the log library
This commit is contained in:
Ponali
2025-09-21 18:41:41 +02:00
parent 39897457f9
commit cf26f610b4
2 changed files with 170 additions and 159 deletions
+48 -40
View File
@@ -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
View File
@@ -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