blob: 3af0ffdb69aeda81dee1e18bb18160f7e8ee11a1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
function lua_async.yield()
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.resume(co)
local status, err = coroutine.resume(co)
if coroutine.status(co) == "dead" or err then
lua_async.limiting.unset_limit(co)
end
if not status then
error("Error (in async function): " .. err)
end
end
function lua_async.run()
assert(lua_async.socket)
local last_time = lua_async.clock()
while true do
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
|