X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=util.lua;h=3af0ffdb69aeda81dee1e18bb18160f7e8ee11a1;hb=HEAD;hp=b3fc4f7eb83712dbaa8b39f41c44fcbc3886a4b3;hpb=643f41af5ff64405f0860cb4c86aaf733aa28cab;p=lua_async.git diff --git a/util.lua b/util.lua index b3fc4f7..3af0ffd 100644 --- a/util.lua +++ b/util.lua @@ -1,26 +1,58 @@ function lua_async.yield() - lua_async.sleep(0) + await(Promise(function(resolve) + setImmediate(resolve) + end)) +end + +function lua_async.sleep(ms) + await(Promise(function(resolve) + setTimeout(resolve, ms) + end)) end function lua_async.kill_thread() coroutine.yield(true) end -function lua_async.sleep(ms) - local co = assert(coroutine.running(), "sleep called outside of an async function") - setTimeout(lua_async.resume, ms, co) +function lua_async.resume(co) + local status, err = coroutine.resume(co) + + if coroutine.status(co) == "dead" or err then + lua_async.limiting.unset_limit(co) + end - coroutine.yield() + if not status then + error("Error (in async function): " .. err) + end end function lua_async.run() - local last_time = os.clock() + assert(lua_async.socket) + local last_time = lua_async.clock() while true do - local current_time = os.clock() + local current_time = lua_async.clock() local dtime = current_time - last_time last_time = current_time lua_async.step(dtime) + + local next = math.huge + + for _, timeout in pairs(lua_async.timeouts.pool) do + next = math.min(next, timeout.time_left) + end + + for _, interval in pairs(lua_async.intervals.pool) do + next = math.min(next, interval.time_left) + end + + if next == math.huge then + return + end + + if next > dtime then + lua_async.socket.sleep(next - dtime) + end end end