From 22f1375380e5c74c5940144d6c6644901dc6bd2a Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Wed, 18 Jan 2023 15:42:38 -0500 Subject: [PATCH] Working on issue with love threaded functions not waiting when in a thread --- init.lua | 11 ++++--- integration/loveManager/init.lua | 49 ++++++++++++++------------------ 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/init.lua b/init.lua index c052218..62eeabd 100644 --- a/init.lua +++ b/init.lua @@ -22,6 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] +traceback = debug.traceback + local multi = {} local mainloopActive = false local isRunning = false @@ -1471,10 +1473,10 @@ function thread:newISOThread(name,func,_env,...) env.multi = multi end if type(name) == "function" then - name = "Thread#"..threadCount + name = "Thread#" .. threadCount end - local func = isolateFunction(func,env) - return thread:newThread(name,func,...) + local func = isolateFunction(func, env) + return thread:newThread(name, func,...) end multi.newThread = thread.newThread @@ -1486,7 +1488,7 @@ local ret,_ local task, thd, ref, ready local switch = { function(th,co)--hold - if clock() - th.intervalR>=th.interval then + if clock() - th.intervalR >= th.interval then t0,t1,t2,t3,t4,t5,t6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16 = th.func() if t0 then if t0==NIL then t0 = nil end @@ -1615,6 +1617,7 @@ co_status = { else ref.OnError:Fire(ref,ret,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16) end + print(ref.Name, traceback()) if i then table.remove(th,i) else diff --git a/integration/loveManager/init.lua b/integration/loveManager/init.lua index bdbc50f..ed415ae 100644 --- a/integration/loveManager/init.lua +++ b/integration/loveManager/init.lua @@ -20,8 +20,7 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 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. -]] -if ISTHREAD then +]] if ISTHREAD then error("You cannot require the loveManager from within a thread!") end local ThreadFileData = [[ @@ -49,50 +48,46 @@ local multi, thread = require("multi"):init() local THREAD = {} __THREADID__ = 0 __THREADNAME__ = "MainThread" -multi.integration={} +multi.integration = {} local THREAD = require("multi.integration.loveManager.threads") local GLOBAL = THREAD.getGlobal() local THREAD_ID = 1 local OBJECT_ID = 0 local stf = 0 -function multi:newSystemThread(name,func,...) +function multi:newSystemThread(name, func, ...) local c = {} c.name = name - c.ID=THREAD_ID - c.thread=love.thread.newThread(ThreadFileData) - c.thread:start(THREAD.dump(func),c.ID,c.name,...) - c.stab = THREAD.createStaticTable(name) - c.OnDeath = multi:newConnection() - c.OnError = multi:newConnection() - GLOBAL["__THREAD_"..c.ID] = {ID=c.ID, Name=c.name, Thread=c.thread} + c.ID = THREAD_ID + c.thread = love.thread.newThread(ThreadFileData) + c.thread:start(THREAD.dump(func), c.ID, c.name, ...) + c.stab = THREAD.createStaticTable(name .. c.ID) + c.OnDeath = multi:newConnection() + c.OnError = multi:newConnection() + 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_ID = THREAD_ID + 1 + function c:getName() return c.name end thread:newThread(function() if name == "TempSystemThread" then - local status_channel = love.thread.getChannel("__"..c.ID.."__MULTI__STATUS_CHANNEL__") + local status_channel = love.thread.getChannel("STATCHAN_" .. c.ID) thread.hold(function() -- While the thread is running we might as well do something in the loop local status = status_channel - if status:peek()~=nil then + if status:peek() ~= nil then c.statusconnector:Fire(unpack(status:pop())) end return not c.thread:isRunning() end) else - thread.hold(function() - return not c.thread:isRunning() - end) + thread.hold(function() return not c.thread:isRunning() end) end -- If the thread is not running let's handle that. local thread_err = c.thread:getError() if thread_err == "Thread Killed!\1" then c.OnDeath:Fire("Thread Killed!") elseif thread_err then - c.OnError:Fire(c,thread_err) + c.OnError:Fire(c, thread_err) elseif c.stab.returns then c.OnDeath:Fire(unpack(c.stab.returns)) c.stab.returns = nil @@ -102,21 +97,19 @@ function multi:newSystemThread(name,func,...) end function THREAD:newFunction(func, holdme) - return thread:newFunctionBase(function(...) - return multi:newSystemThread("TempSystemThread", func, ...) - end, holdme)() + return thread:newFunctionBase(function(...) + return multi:newSystemThread("TempSystemThread", func, ...) + end, holdme)() end THREAD.newSystemThread = multi.newSystemThread function love.threaderror(thread, errorstr) - multi.print("Thread error!\n"..errorstr) + multi.print("Thread error!\n" .. errorstr) end multi.integration.GLOBAL = GLOBAL multi.integration.THREAD = THREAD require("multi.integration.loveManager.extensions") multi.print("Integrated Love Threading!") -return {init=function() - return GLOBAL,THREAD -end} \ No newline at end of file +return {init = function() return GLOBAL, THREAD end}