From b0ab40d41003fcf830533ee3f721aa2d36284ac4 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Tue, 19 Apr 2022 18:39:30 -0400 Subject: [PATCH] Fixed some bugs, a little more testing needed --- README.md | 12 +++++-- multi/init.lua | 3 +- multi/integration/lanesManager/init.lua | 3 ++ multi/integration/loveManager/init.lua | 3 ++ multi/integration/pesudoManager/init.lua | 22 +++++++----- multi/integration/pesudoManager/threads.lua | 2 +- test4.lua | 39 --------------------- 7 files changed, 31 insertions(+), 53 deletions(-) delete mode 100644 test4.lua diff --git a/README.md b/README.md index 537a0cd..e7390f2 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,9 @@ Progress is being made in [v15.3.0](https://github.com/rayaman/multi/tree/v15.3. INSTALLING ---------- -Link to dependencies: +Link to optional dependencies: [lanes](https://github.com/LuaLanes/lanes) +[love2d](https://love2d.org/) To install copy the multi folder into your environment and you are good to go
If you want to use the system threads, then you'll need to install lanes or love2d game engine! @@ -32,7 +33,7 @@ https://discord.gg/U8UspuA Planned features/TODO --------------------- -- [ ] Create test suite +- [ ] Create test suite (In progress, mostly done) - [ ] Network Parallelism rework Usage: [Check out the documentation for more info](https://github.com/rayaman/multi/blob/master/Documentation.md) @@ -40,7 +41,8 @@ Usage: [Check out the documentation for more info](https://github.com/rayaman/mu ```lua local multi, thread = require("multi"):init() -GLOBAL, THREAD = require("multi.integration.lanesManager"):init() +GLOBAL, THREAD = require("multi.integration.threading"):init() + multi:newSystemThread("System Thread",function() while true do THREAD.sleep(.1) @@ -48,6 +50,7 @@ multi:newSystemThread("System Thread",function() THREAD.kill() end end) + multi:newThread("Coroutine Based Thread",function() while true do io.write("Hello") @@ -55,12 +58,15 @@ multi:newThread("Coroutine Based Thread",function() thread.kill() end end) + multi:newTLoop(function(loop) print("!") loop:Destroy() os.exit() end,.3) + multi:mainloop() + --[[ while true do multi:uManager() diff --git a/multi/init.lua b/multi/init.lua index adca53d..c06c6c8 100644 --- a/multi/init.lua +++ b/multi/init.lua @@ -1164,7 +1164,6 @@ function thread:newFunctionBase(generator,holdme) if thread.isThread() then return thread.hold(function() if err then - print("ERROR",err) return multi.NIL, err elseif rets then return cleanReturns((rets[1] or multi.NIL),rets[2],rets[3],rets[4],rets[5],rets[6],rets[7],rets[8],rets[9],rets[10],rets[11],rets[12],rets[13],rets[14],rets[15],rets[16]) @@ -1344,7 +1343,7 @@ function thread:newISOThread(name,func,_env,...) name = "Thread#"..threadCount end local func = isolateFunction(func,env) - return thread:newThread(name,func) + return thread:newThread(name,func,...) end multi.newThread = thread.newThread diff --git a/multi/integration/lanesManager/init.lua b/multi/integration/lanesManager/init.lua index 043c1ad..316c24d 100644 --- a/multi/integration/lanesManager/init.lua +++ b/multi/integration/lanesManager/init.lua @@ -92,6 +92,9 @@ function multi:newSystemThread(name, func, ...) has_error = false end)(...) count = count + 1 + function c:getName() + return c.Name + end function c:kill() self.thread:cancel() self.alive = false diff --git a/multi/integration/loveManager/init.lua b/multi/integration/loveManager/init.lua index f0af116..93a5a2c 100644 --- a/multi/integration/loveManager/init.lua +++ b/multi/integration/loveManager/init.lua @@ -61,6 +61,9 @@ function multi:newSystemThread(name,func,...) GLOBAL["__THREAD_"..c.ID] = {ID=c.ID, Name=c.name, Thread=c.thread} GLOBAL["__THREAD_COUNT"] = THREAD_ID THREAD_ID=THREAD_ID + 1 + function c:getName() + return c.name + end thread:newThread(function() if name:find("TempSystemThread") then local status_channel = love.thread.getChannel("__"..c.ID.."__MULTI__STATUS_CHANNEL__") diff --git a/multi/integration/pesudoManager/init.lua b/multi/integration/pesudoManager/init.lua index 6297dc5..84bdca3 100644 --- a/multi/integration/pesudoManager/init.lua +++ b/multi/integration/pesudoManager/init.lua @@ -50,7 +50,8 @@ local function split(str) return tab end -THREAD.newFunction=thread.newFunction +local tab = [[_VERSION,io,os,require,load,debug,assert,collectgarbage,error,getfenv,getmetatable,ipairs,loadstring,module,next,pairs,pcall,print,rawequal,rawget,rawset,select,setfenv,setmetatable,tonumber,tostring,type,unpack,xpcall,math,coroutine,string,table]] +tab = split(tab) local id = 0 function multi:newSystemThread(name,func,...) @@ -67,23 +68,28 @@ function multi:newSystemThread(name,func,...) thread = thread } - local tab = [[_VERSION,io,os,require,load,debug,assert,collectgarbage,error,getfenv,getmetatable,ipairs,loadstring,module,next,pairs,pcall,print,rawequal,rawget,rawset,select,setfenv,setmetatable,tonumber,tostring,type,unpack,xpcall,math,coroutine,string,table]] - tab = split(tab) for i = 1,#tab do env[tab[i]] = _G[tab[i]] end - --setmetatable(env,{__index=env}) - thread:newISOThread(name,func,env,...).OnError(function(self,msg) - print("ERROR:",msg) - end) + + local th = thread:newISOThread(name,func,env,...) + id = id + 1 + + return th end THREAD.newSystemThread = multi.newSystemThread -- System threads as implemented here cannot share memory, but use a message passing system. -- An isolated thread allows us to mimic that behavior so if access data from the "main" thread happens things will not work. This behavior is in line with how the system threading works -print("Integrated Pesudo Threading!") +function THREAD:newFunction(func,holdme) + return thread:newFunctionBase(function(...) + return multi:newSystemThread("TempSystemThread",func,...) + end,holdme)() +end + +multi.print("Integrated Pesudo Threading!") multi.integration = {} -- for module creators multi.integration.GLOBAL = GLOBAL multi.integration.THREAD = THREAD diff --git a/multi/integration/pesudoManager/threads.lua b/multi/integration/pesudoManager/threads.lua index 0cbae07..b8ee6aa 100644 --- a/multi/integration/pesudoManager/threads.lua +++ b/multi/integration/pesudoManager/threads.lua @@ -21,6 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] + local function getOS() if package.config:sub(1, 1) == "\\" then return "windows" @@ -30,7 +31,6 @@ local function getOS() end local function INIT(thread) - print("T",thread.sleep) local THREAD = {} local GLOBAL = {} THREAD.Priority_Core = 3 diff --git a/test4.lua b/test4.lua deleted file mode 100644 index 21dba20..0000000 --- a/test4.lua +++ /dev/null @@ -1,39 +0,0 @@ -package.path = "./?.lua;?/init.lua;"..package.path -local multi,thread = require("multi"):init() ---[[ Testing... -Before AVG: 522386 -Test 1 AVG: -]] -local sleep_for = 1 -local conn = multi:newConnection() -local test = {} -local function bench(_,steps) - print("Steps/1s: "..steps) - --os.exit() -end -proc = multi:newProcessor("Test") - -proc.Start() - -multi:newTLoop(function() - -end,1) - --- thread:newThread(function() --- while true do --- thread.sleep(1) --- print("Proc: ".. tostring(proc.isActive())) --- end --- end) - -local func = proc:newFunction(function(a,b,c) - print("Testing proc functions!") - error("Testing") - return "Please", "Smile", 123 -end) - -func("Some","tests","needed").connect(function(a,b,c) - print("Return",a,b,c) -end) - -multi:mainloop()