From: Elias Fleckenstein Date: Sun, 21 Nov 2021 15:37:08 +0000 (+0100) Subject: Sleep for unused tick time & optional realtime X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=40beef755f0c47691b5cd5a79e76fdd361320aa8;p=lua_async.git Sleep for unused tick time & optional realtime - Optional luasocket dependency for realtime measurements (instead of CPU time) - lua_async.run() will wait for the time to be ready --- diff --git a/events.lua b/events.lua index ee723e8..4796973 100644 --- a/events.lua +++ b/events.lua @@ -9,7 +9,7 @@ function Event(type, data) type = type, data = data, defaultPrevented = false, - timeStamp = os.clock(), + timeStamp = lua_async.clock(), }, {__index = EventPrototype}) end diff --git a/init.lua b/init.lua index 07bea3e..368ffa9 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,13 @@ lua_async = {} +if rawget(_G, "require") then + lua_async.socket = require("socket") +end + +function lua_async.clock() + return lua_async.socket and lua_async.socket.gettime() or os.clock() +end + function lua_async.step(dtime) -- timers phase lua_async.timeouts.step(dtime) diff --git a/limiting.lua b/limiting.lua index d5df448..394006d 100644 --- a/limiting.lua +++ b/limiting.lua @@ -13,7 +13,7 @@ function lua_async.set_limit(ms) lua_async.limiting.pool[co] = { limit = limit, - next_yield = os.clock() + limit, + next_yield = lua_async.clock() + limit, } end @@ -26,9 +26,9 @@ function lua_async.check_limit() local co = assert(coroutine.running(), "check_limit called outside of an async function") local limit = lua_async.limiting.pool[co] - if limit and os.clock() >= limit.next_yield then + if limit and lua_async.clock() >= limit.next_yield then lua_async.yield() - limit.next_yield = os.clock() + limit.limit + limit.next_yield = lua_async.clock() + limit.limit return true end diff --git a/util.lua b/util.lua index 7061c06..dbef0b5 100644 --- a/util.lua +++ b/util.lua @@ -27,13 +27,30 @@ function lua_async.resume(co) 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) + next = math.min(next, timeout.time_left) + end + + for _, interval in pairs(lua_async.intervals.pool) + next = math.min(next, interval.time_left) + end + + if next == math.huge then + return + end + + lua_async.socket.sleep(next) end end