Working on issue with love threaded functions not waiting when in a thread
This commit is contained in:
parent
6ed5555706
commit
22f1375380
11
init.lua
11
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
|
||||
|
||||
@ -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}
|
||||
return {init = function() return GLOBAL, THREAD end}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user