Log In  

There used to be an issue where coroutines would yield unexpectedly if they took to long to execute.
This was fixed a while back, but I see that for coroutines that themselves run inside coroutines - this still happens.

In the below code, in the 'coroincoro' case, nil is yielded instead of 1, showing that the yield happened sometimes before the "real" yield call.

sleep=function() for i=0,100,0.00002 do end yield(1) end

function test(name, func, ...)
    local coro=cocreate(func, ...)
    local ok,result=coresume(coro)
    print(name..": "..tostr(ok)..", "..tostr(result))
end

test("coroutine", sleep)

local cc = cocreate(function()
    test("coroincoro", sleep)
end)
coresume(cc)
P#109790 2022-04-06 16:46

I inserted a flip() between the coroutines to isolate the second one vs. vblank, then twiddled the loop count until I found the sweet spot. It turns out the the works/doesn't work threshold is around 139K iterations or, in context, probably 8Mhz/60.

Definitely seems like a frame interrupt.

P#109810 2022-04-06 23:20 ( Edited 2022-04-06 23:22)

Nice catch, thanks @thisismypassword -- fixed for 0.2.4d

This was also happening when going over 2MB Lua RAM while inside a nested coroutine. It's supposed to exit the vm loop (luaV_execute), try a GC to see if it can stay under 2MB (usually the case), and then restore the thread stack when successful using the same process.

P#110535 2022-04-20 01:45

[Please log in to post a comment]

Follow Lexaloffle:          
Generated 2024-03-29 09:13:19 | 0.027s | Q:15