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
This commit is contained in:
Elias Fleckenstein 2021-11-21 16:37:08 +01:00
parent d8c45339fc
commit 40beef755f
No known key found for this signature in database
GPG Key ID: 06927A5199D6C9B2
4 changed files with 31 additions and 6 deletions

View File

@ -9,7 +9,7 @@ function Event(type, data)
type = type,
data = data,
defaultPrevented = false,
timeStamp = os.clock(),
timeStamp = lua_async.clock(),
}, {__index = EventPrototype})
end

View File

@ -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)

View File

@ -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

View File

@ -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