From ec5bf74009f269fc1f9ffaa37a33f00ad5a1b4c3 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sat, 31 Dec 2022 02:21:01 -0500 Subject: [PATCH] Fixed love2d STCs! Actually before new years :P --- integration/loveManager/extensions.lua | 30 ++-- integration/loveManager/init.lua | 12 +- tests/test.lua | 182 ++++++++++++------------- 3 files changed, 116 insertions(+), 108 deletions(-) diff --git a/integration/loveManager/extensions.lua b/integration/loveManager/extensions.lua index 965915a..da5b560 100644 --- a/integration/loveManager/extensions.lua +++ b/integration/loveManager/extensions.lua @@ -27,7 +27,8 @@ if not ISTHREAD then GLOBAL = multi.integration.GLOBAL THREAD = multi.integration.THREAD else - + GLOBAL = multi.integration.GLOBAL + THREAD = multi.integration.THREAD end function multi:newSystemThreadedQueue(name) @@ -218,17 +219,17 @@ function multi:newSystemThreadedConnection(name) c.PING = 0x02 c.PONG = 0x03 - local subscribe = multi:newSystemThreadedQueue("SUB_STC_" .. name):init() + local subscribe = love.thread.getChannel("SUB_STC_" .. name) function c:init() - self.subscribe = THREAD.waitFor("SUB_STC_" .. self.Name):init() + self.subscribe = love.thread.getChannel("SUB_STC_" .. self.Name) function self:Fire(...) local args = {...} if self.CID == THREAD.getID() then -- Host Call for _, link in pairs(self.links) do - link:push{self.TRIG, args} + love.thread.getChannel(link):push{self.TRIG, args} end self.proxy_conn:Fire(...) else @@ -245,7 +246,7 @@ function multi:newSystemThreadedConnection(name) thread:newThread("STC_CONN_MAN" .. self.Name,function() local item local string_self_ref = "LSF_" .. multi.randomString(16) - local link_self_ref = multi:newSystemThreadedQueue():init() + local link_self_ref = love.thread.getChannel(string_self_ref) self.subscribe:push{self.CONN, string_self_ref} while true do item = thread.hold(function() @@ -256,7 +257,7 @@ function multi:newSystemThreadedConnection(name) link_self_ref:pop() elseif item[1] == self.CONN then if string_self_ref ~= item[2] then - table.insert(self.links, THREAD.waitFor(item[2]):init()) + table.insert(self.links, love.thread.getChannel(item[2])) end link_self_ref:pop() elseif item[1] == self.TRIG then @@ -286,7 +287,7 @@ function multi:newSystemThreadedConnection(name) local ping local pong = function(link, links) local res = thread.hold(function() - return link:peek()[1] == c.PONG + return love.thread.getChannel(link):peek()[1] == c.PONG end,{sleep=3}) if not res then @@ -297,7 +298,7 @@ function multi:newSystemThreadedConnection(name) end end else - link:pop() + love.thread.getChannel(link):pop() end end @@ -305,8 +306,8 @@ function multi:newSystemThreadedConnection(name) ping:Pause() multi.ForEach(self.links, function(link) -- Sync new connections - link:push{self.PING} - multi:newThread("pong Thread", pong, link, links) + love.thread.getChannel(link):push{self.PING} + multi:newThread("pong Thread", pong, link, self.links) end) thread.sleep(3) @@ -316,7 +317,7 @@ function multi:newSystemThreadedConnection(name) local function fire(...) for _, link in pairs(c.links) do - link:push {c.TRIG, {...}} + love.thread.getChannel(link):push {c.TRIG, {...}} end end @@ -330,11 +331,12 @@ function multi:newSystemThreadedConnection(name) return c.subscribe:pop() end) if item[1] == c.CONN then + multi.ForEach(c.links, function(link) -- Sync new connections - THREAD.waitFor(item[2]):init():push{c.CONN, link.Name} + love.thread.getChannel(item[2]):push{c.CONN, link} end) - print("Adding link") - c.links[#c.links+1] = THREAD.waitFor(item[2]):init() + c.links[#c.links+1] = item[2] + elseif item[1] == c.TRIG then fire(unpack(item[2])) c.proxy_conn:Fire(unpack(item[2])) diff --git a/integration/loveManager/init.lua b/integration/loveManager/init.lua index dd2d402..dd0e929 100644 --- a/integration/loveManager/init.lua +++ b/integration/loveManager/init.lua @@ -26,16 +26,23 @@ if ISTHREAD then end local ThreadFileData = [[ ISTHREAD = true -THREAD = require("multi.integration.loveManager.threads") -- order is important! +THREAD = require("multi.integration.loveManager.threads") sThread = THREAD __IMPORTS = {...} __FUNC__=table.remove(__IMPORTS,1) __THREADID__=table.remove(__IMPORTS,1) __THREADNAME__=table.remove(__IMPORTS,1) +math.randomseed(__THREADID__) +math.random() +math.random() +math.random() stab = THREAD.createStaticTable(__THREADNAME__) GLOBAL = THREAD.getGlobal() multi, thread = require("multi").init() -print(pcall(require,"multi.integration.loveManager.extensions")) +multi.integration={} +multi.integration.GLOBAL = GLOBAL +multi.integration.THREAD = THREAD +pcall(require,"multi.integration.loveManager.extensions") stab["returns"] = {THREAD.loadDump(__FUNC__)(unpack(__IMPORTS))} ]] local multi, thread = require("multi"):init() @@ -43,7 +50,6 @@ local THREAD = {} __THREADID__ = 0 __THREADNAME__ = "MainThread" multi.integration={} -multi.integration.love2d={} local THREAD = require("multi.integration.loveManager.threads") local GLOBAL = THREAD.getGlobal() local THREAD_ID = 1 diff --git a/tests/test.lua b/tests/test.lua index b4dddf4..4387b11 100644 --- a/tests/test.lua +++ b/tests/test.lua @@ -5,41 +5,41 @@ multi:getOptimizationConnection()(function(msg) print(msg) end) -local conn1, conn2, conn3 = multi:newConnection(), multi:newConnection():fastMode(), multi:newConnection() +-- local conn1, conn2, conn3 = multi:newConnection(), multi:newConnection():fastMode(), multi:newConnection() -local link = conn1(function() - print("Conn1, first") -end) +-- local link = conn1(function() +-- print("Conn1, first") +-- end) -local link2 = conn1(function() - print("Conn1, second") -end) +-- local link2 = conn1(function() +-- print("Conn1, second") +-- end) -local link3 = conn1(function() - print("Conn1, third") -end) +-- local link3 = conn1(function() +-- print("Conn1, third") +-- end) -local link4 = conn2(function() - print("Conn2, first") -end) +-- local link4 = conn2(function() +-- print("Conn2, first") +-- end) -local link5 = conn2(function() - print("Conn2, second") -end) +-- local link5 = conn2(function() +-- print("Conn2, second") +-- end) -local link6 = conn2(function() - print("Conn2, third") -end) +-- local link6 = conn2(function() +-- print("Conn2, third") +-- end) -print("All conns\n-------------") -conn1:Fire() -conn2:Fire() +-- print("All conns\n-------------") +-- conn1:Fire() +-- conn2:Fire() -conn1:Unconnect(link3) -conn2:Unconnect(link6) -print("All conns Edit\n---------------------") -conn1:Fire() -conn2:Fire() +-- conn1:Unconnect(link3) +-- conn2:Unconnect(link6) +-- print("All conns Edit\n---------------------") +-- conn1:Fire() +-- conn2:Fire() -- thread:newThread(function() -- print("Awaiting status") @@ -60,74 +60,74 @@ conn2:Fire() -- conn3:Fire() -- end) --- local conn = multi:newSystemThreadedConnection("conn"):init() +local conn = multi:newSystemThreadedConnection("conn"):init() --- multi:newSystemThread("Thread_Test_1", function() --- local multi, thread = require("multi"):init() --- local conn = GLOBAL["conn"]:init() --- local console = THREAD.getConsole() --- conn(function(a,b,c) --- console.print(THREAD:getName().." was triggered!",a,b,c) --- end) --- multi:mainloop() --- end) +multi:newSystemThread("Thread_Test_1", function() + local multi, thread = require("multi"):init() + local conn = GLOBAL["conn"]:init() + local console = THREAD.getConsole() + conn(function(a,b,c) + console.print(THREAD:getName().." was triggered!",a,b,c) + end) + multi:mainloop() +end) --- multi:newSystemThread("Thread_Test_2", function() --- local multi, thread = require("multi"):init() --- local conn = GLOBAL["conn"]:init() --- local console = THREAD.getConsole() --- conn(function(a,b,c) --- console.print(THREAD:getName().." was triggered!",a,b,c) --- end) --- multi:newAlarm(2):OnRing(function() --- console.print("Fire 2!!!") --- conn:Fire(4,5,6) --- THREAD.kill() --- end) +multi:newSystemThread("Thread_Test_2", function() + local multi, thread = require("multi"):init() + local conn = GLOBAL["conn"]:init() + local console = THREAD.getConsole() + conn(function(a,b,c) + console.print(THREAD:getName().." was triggered!",a,b,c) + end) + multi:newAlarm(2):OnRing(function() + console.print("Fire 2!!!") + conn:Fire(4,5,6) + THREAD.kill() + end) --- multi:mainloop() --- end) --- local console = THREAD.getConsole() --- conn(function(a,b,c) --- console.print("Mainloop conn got triggered!",a,b,c) --- end) + multi:mainloop() +end) +local console = THREAD.getConsole() +conn(function(a,b,c) + console.print("Mainloop conn got triggered!",a,b,c) +end) --- alarm = multi:newAlarm(1) --- alarm:OnRing(function() --- console.print("Fire 1!!!") --- conn:Fire(1,2,3) --- end) +alarm = multi:newAlarm(1) +alarm:OnRing(function() + console.print("Fire 1!!!") + conn:Fire(1,2,3) +end) --- alarm = multi:newAlarm(3):OnRing(function() --- multi:newSystemThread("Thread_Test_3",function() --- local multi, thread = require("multi"):init() --- local conn = GLOBAL["conn"]:init() --- local console = THREAD.getConsole() --- conn(function(a,b,c) --- console.print(THREAD:getName().." was triggered!",a,b,c) --- end) --- multi:newAlarm(4):OnRing(function() --- console.print("Fire 3!!!") --- conn:Fire(7,8,9) --- end) --- multi:mainloop() --- end) --- end) +alarm = multi:newAlarm(3):OnRing(function() + multi:newSystemThread("Thread_Test_3",function() + local multi, thread = require("multi"):init() + local conn = GLOBAL["conn"]:init() + local console = THREAD.getConsole() + conn(function(a,b,c) + console.print(THREAD:getName().." was triggered!",a,b,c) + end) + multi:newAlarm(4):OnRing(function() + console.print("Fire 3!!!") + conn:Fire(7,8,9) + end) + multi:mainloop() + end) +end) --- multi:newSystemThread("Thread_Test_4",function() --- local multi, thread = require("multi"):init() --- local conn = GLOBAL["conn"]:init() --- local conn2 = multi:newConnection() --- local console = THREAD.getConsole() --- multi:newAlarm(2):OnRing(function() --- conn2:Fire() --- end) --- multi:newThread(function() --- console.print("Conn Test!") --- thread.hold(conn + conn2) --- console.print("It held!") --- end) --- multi:mainloop() --- end) +multi:newSystemThread("Thread_Test_4",function() + local multi, thread = require("multi"):init() + local conn = GLOBAL["conn"]:init() + local conn2 = multi:newConnection() + local console = THREAD.getConsole() + multi:newAlarm(2):OnRing(function() + conn2:Fire() + end) + multi:newThread(function() + console.print("Conn Test!") + thread.hold(conn + conn2) + console.print("It held!") + end) + multi:mainloop() +end) --- multi:mainloop() \ No newline at end of file +multi:mainloop() \ No newline at end of file