From bb7fab0857ebe7a9a6bed60c1e2d9b9619c4e1a8 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sun, 18 Sep 2022 13:56:00 -0400 Subject: [PATCH] working on systemthreadedconnections --- changes.md | 4 ++++ multi/init.lua | 8 +++++++- test.lua | 25 ++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/changes.md b/changes.md index 8b235e7..bd5bcae 100644 --- a/changes.md +++ b/changes.md @@ -17,6 +17,10 @@ Added Sets the helper function that the connection object uses when creating connection links. +- `multi.ForEach(table, callback_function)` + + Loops through the table and calls callback_function with each element of the array. + Changed --- - `Connection:[connect, hasConnections, getConnection]` changed to be `Connection:[Connect, HasConnections, getConnections]`. This was done in an attempt to follow a consistent naming scheme. The old methods still will work to prevent old code breaking. diff --git a/multi/init.lua b/multi/init.lua index 2cd2953..fe2f078 100644 --- a/multi/init.lua +++ b/multi/init.lua @@ -109,6 +109,12 @@ function multi:getStats() end --Helpers +function multi.ForEach(tab,func) + for i=1,#tab do + func(tab[i]) + end +end + local ignoreconn = true function multi:newConnection(protect,func,kill) local c={} @@ -198,6 +204,7 @@ function multi:newConnection(protect,func,kill) end else function c:Fire(...) + if lock then return end for i=#call_funcs,1,-1 do call_funcs[i](...) if kill then @@ -272,7 +279,6 @@ function multi:newConnection(protect,func,kill) }) function temp:Fire(...) - if lock then return end return call_funcs(...) end diff --git a/test.lua b/test.lua index f92ec6d..bba1341 100644 --- a/test.lua +++ b/test.lua @@ -3,24 +3,34 @@ package.cpath = "lua5.4/lib/lua/?/core.dll;"..package.cpath multi, thread = require("multi"):init{print=true} GLOBAL, THREAD = require("multi.integration.lanesManager"):init() + + function multi:newSystemThreadedConnection(name,...) local c = {} + c.CONN = 0x00 + c.TRIG = 0x01 + c.PING = 0x02 + c.PONG = 0x03 local proxy_conn = multi:newConnection(...) local name = name or multi.randomString(16) local connections = {} -- All triggers sent from main connection. When a connection is triggered on another thread, they speak to the main then send stuff out. + local funcs = {} setmetatable(c,master_conn) -- A different approach will be taken for the non main connection objects c.subscribe = multi:newSystemThreadedQueue("Subscribe_"..name):init() -- Incoming subscriptions multi:newThread("STC_"..name,function() while true do + thread.yield() local item = c.subscribe:pop() -- We need to check on broken connections -- c:Ping() -- if item ~= nil then connections[#connections+1] = item + multi.ForEach(funcs, function(link) -- Sync new connections + item:push{c.CONN, link} + end) thread.skip(multi.Priority_Normal) -- Usually a bunch of threads subscribe close to the same time. Process those by ensuring that they come alive around the same time - else -- I'm using these "Constants" since they may change with other releases and this should allow these functions to adjust with them. - thread.skip(multi.Priority_Idle) + -- I'm using these "Constants" since they may change with other releases and this should allow these functions to adjust with them. end end end) @@ -30,9 +40,18 @@ function multi:newSystemThreadedConnection(name,...) function c:Fire(...) -- end - function c:Connect(...) + function c:Sync(link) -- end + function c:Connect(func) + local conn_func = func + proxy_conn(function() + funcs[#funcs+1] = func -- Used for syncing new connections to this connection later on + multi.ForEach(c.connections, function(link) + link:push{CONN, func} + end) + end) + end function c:init() return self end