From d771a1fe392d507b38ee98bd329d22f8f31c628e Mon Sep 17 00:00:00 2001 From: Ponali Date: Wed, 15 Oct 2025 18:34:33 +0200 Subject: [PATCH] added a cleanup routine to IPC there's also lazyvim reformatting everything, like usual --- halyde/kernel/modules/ipc.lua | 283 +++++++++++++++++++--------------- 1 file changed, 159 insertions(+), 124 deletions(-) diff --git a/halyde/kernel/modules/ipc.lua b/halyde/kernel/modules/ipc.lua index 1698702..49c0999 100644 --- a/halyde/kernel/modules/ipc.lua +++ b/halyde/kernel/modules/ipc.lua @@ -1,9 +1,11 @@ local module = {} +module.dependencies = { "tsched" } function module.check() return true -- IPC should always be loaded end +local checkProcess function module.init() _G.ipc = {} _G.ipc.shared = {} @@ -11,126 +13,134 @@ function module.init() function _PUBLIC.ipc.shareWithAll() local shareTable = {} - setmetatable(shareTable, {["__newindex"] = function(_, key, value) - local currentPID = _PUBLIC.tsched.getCurrentTask().id - if not _G.ipc.shared[currentPID] then - _G.ipc.shared[currentPID] = {} -- TODO: Add some kind of cleanup routine since these IPC shares can just keep piling up - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == "all" then - globalTable = tab + setmetatable(shareTable, { + ["__newindex"] = function(_, key, value) + local currentPID = _PUBLIC.tsched.getCurrentTask().id + if not _G.ipc.shared[currentPID] then + _G.ipc.shared[currentPID] = {} end - end - if not globalTable then - globalTable = {["sharedWith"] = "all"} - table.insert(_G.ipc.shared[currentPID], globalTable) - end - if not globalTable.vars then - globalTable.vars = {} - end - globalTable.vars[key] = value - end, ["__index"] = function(_, key) - local currentPID = _PUBLIC.tsched.getCurrentTask().id - if not _G.ipc.shared[currentPID] then - return nil - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == "all" then - globalTable = tab + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == "all" then + globalTable = tab + end end - end - if not globalTable then - return nil - end - if not globalTable.vars then - return nil - end - return globalTable.vars[key] - end,["__pairs"]=function() - if not _G.ipc.shared[currentPID] then - return pairs({}) - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == pid then - globalTable = tab + if not globalTable then + globalTable = { ["sharedWith"] = "all" } + table.insert(_G.ipc.shared[currentPID], globalTable) + end + if not globalTable.vars then + globalTable.vars = {} + end + globalTable.vars[key] = value + end, + ["__index"] = function(_, key) + local currentPID = _PUBLIC.tsched.getCurrentTask().id + if not _G.ipc.shared[currentPID] then + return nil + end + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == "all" then + globalTable = tab + end + end + if not globalTable then + return nil + end + if not globalTable.vars then + return nil + end + return globalTable.vars[key] + end, + ["__pairs"] = function() + if not _G.ipc.shared[currentPID] then + return pairs({}) + end + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == pid then + globalTable = tab + end + end + if not globalTable then + return pairs({}) + end + if not globalTable.vars then + return pairs({}) end - end - if not globalTable then - return pairs({}) - end - if not globalTable.vars then - return pairs({}) - end - return pairs(table.copy(globalTable.vars)) - end}) + return pairs(table.copy(globalTable.vars)) + end, + }) return shareTable end function _PUBLIC.ipc.shareWith(pid) checkArg(1, pid, "number") local shareTable = {} - setmetatable(shareTable, {["__newindex"] = function(_, key, value) - local currentPID = _PUBLIC.tsched.getCurrentTask().id - if not _G.ipc.shared[currentPID] then - _G.ipc.shared[currentPID] = {} -- TODO: Add some kind of cleanup routine since these IPC shares can just keep piling up - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == "all" then - globalTable = tab + setmetatable(shareTable, { + ["__newindex"] = function(_, key, value) + local currentPID = _PUBLIC.tsched.getCurrentTask().id + if not _G.ipc.shared[currentPID] then + _G.ipc.shared[currentPID] = {} end - end - if not globalTable then - globalTable = {["sharedWith"] = pid} - table.insert(_G.ipc.shared[currentPID], globalTable) - end - if not globalTable.vars then - globalTable.vars = {} - end - globalTable.vars[key] = value - end, ["__index"] = function(_, key) - print(_G.ipc.shared) + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == "all" then + globalTable = tab + end + end + if not globalTable then + globalTable = { ["sharedWith"] = pid } + table.insert(_G.ipc.shared[currentPID], globalTable) + end + if not globalTable.vars then + globalTable.vars = {} + end + globalTable.vars[key] = value + end, + ["__index"] = function(_, key) + print(_G.ipc.shared) - local currentPID = _PUBLIC.tsched.getCurrentTask().id - if not _G.ipc.shared[currentPID] then - return nil - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == pid then - globalTable = tab + local currentPID = _PUBLIC.tsched.getCurrentTask().id + if not _G.ipc.shared[currentPID] then + return nil end - end - if not globalTable then - return nil - end - if not globalTable.vars then - return nil - end - return globalTable.vars[key] - end,["__pairs"]=function() - if not _G.ipc.shared[currentPID] then - return pairs({}) - end - local globalTable - for _, tab in pairs(_G.ipc.shared[currentPID]) do - if tab.sharedWith == pid then - globalTable = tab + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == pid then + globalTable = tab + end + end + if not globalTable then + return nil + end + if not globalTable.vars then + return nil + end + return globalTable.vars[key] + end, + ["__pairs"] = function() + if not _G.ipc.shared[currentPID] then + return pairs({}) + end + local globalTable + for _, tab in pairs(_G.ipc.shared[currentPID]) do + if tab.sharedWith == pid then + globalTable = tab + end + end + if not globalTable then + return pairs({}) + end + if not globalTable.vars then + return pairs({}) end - end - if not globalTable then - return pairs({}) - end - if not globalTable.vars then - return pairs({}) - end - return pairs(table.copy(globalTable.vars)) - end}) + return pairs(table.copy(globalTable.vars)) + end, + }) -- check if the reverse is also available --[[ if not _G.ipc.shared[pid] then @@ -150,35 +160,60 @@ function module.init() end _PUBLIC.ipc.shared = {} - setmetatable(_PUBLIC.ipc.shared, {["__index"] = function(_, pid) - local currentPID = _PUBLIC.tsched.getCurrentTask().id - local returnTable = {} - for _, shareTable in pairs(ipc.shared[pid] or {}) do - if shareTable.sharedWith == currentPID then - for key, value in pairs(shareTable.vars) do - returnTable[key] = table.copy(value) - end - elseif shareTable.sharedWith == "all" then - for key, value in pairs(shareTable.vars) do - if not returnTable[key] then + setmetatable(_PUBLIC.ipc.shared, { + ["__index"] = function(_, pid) + local currentPID = _PUBLIC.tsched.getCurrentTask().id + local returnTable = {} + for _, shareTable in pairs(ipc.shared[pid] or {}) do + if shareTable.sharedWith == currentPID then + for key, value in pairs(shareTable.vars) do returnTable[key] = table.copy(value) end + elseif shareTable.sharedWith == "all" then + for key, value in pairs(shareTable.vars) do + if not returnTable[key] then + returnTable[key] = table.copy(value) + end + end end end + return returnTable + end, + ["__pairs"] = function() + local ftbl = {} + for i in pairs(_G.ipc.shared) do + ftbl[i] = _PUBLIC.ipc.shared[i] + end + return pairs(ftbl) + end, + }) + + _, checkProcess = _PUBLIC.tsched.addTask(function() + while true do + -- get all PIDs that exists + local tasks = _PUBLIC.tsched.getTasks() + local pids = {} + for _, v in pairs(tasks) do + table.insert(pids, v.id) + end + + -- get all shares from unexistant processes and delete them + for i in pairs(_G.ipc.shared) do + if not table.find(pids, i) then + _G.ipc.shared[i] = nil + end + end + + -- let the other processes run + coroutine.yield() end - return returnTable - end,["__pairs"]=function() - local ftbl = {} - for i in pairs(_G.ipc.shared) do - ftbl[i]=_PUBLIC.ipc.shared[i] - end - return pairs(ftbl) - end}) + end, "ipc") end function module.exit() _G.ipc = nil _PUBLIC.ipc = nil + _PUBLIC.tsched.removeTask(checkProcess.id) end return module