aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2021-11-21 16:37:08 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2021-11-21 16:37:08 +0100
commit40beef755f0c47691b5cd5a79e76fdd361320aa8 (patch)
tree023dc702cab44be6b500dc0f1ef549090498e9b6
parentd8c45339fcef6609dcc423480dcb70986237bf61 (diff)
downloadlua_async-40beef755f0c47691b5cd5a79e76fdd361320aa8.tar.xz
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
-rw-r--r--events.lua2
-rw-r--r--init.lua8
-rw-r--r--limiting.lua6
-rw-r--r--util.lua21
4 files changed, 31 insertions, 6 deletions
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