]> git.lizzy.rs Git - lua_async.git/blob - util.lua
Merge branch 'master' of https://github.com/EliasFleckenstein03/lua_async
[lua_async.git] / util.lua
1 function lua_async.yield()
2         await(Promise(function(resolve)
3                 setImmediate(resolve)
4         end))
5 end
6
7 function lua_async.sleep(ms)
8         await(Promise(function(resolve)
9                 setTimeout(resolve, ms)
10         end))
11 end
12
13 function lua_async.kill_thread()
14         coroutine.yield(true)
15 end
16
17 function lua_async.resume(co)
18         local status, err = coroutine.resume(co)
19
20         if coroutine.status(co) == "dead" or err then
21                 lua_async.limiting.unset_limit(co)
22         end
23
24         if not status then
25                 error("Error (in async function): " .. err)
26         end
27 end
28
29 function lua_async.run()
30         assert(lua_async.socket)
31         local last_time = lua_async.clock()
32
33         while true do
34                 local current_time = lua_async.clock()
35                 local dtime = current_time - last_time
36                 last_time = current_time
37
38                 lua_async.step(dtime)
39
40                 local next = math.huge
41
42                 for _, timeout in pairs(lua_async.timeouts.pool) do
43                         next = math.min(next, timeout.time_left)
44                 end
45
46                 for _, interval in pairs(lua_async.intervals.pool) do
47                         next = math.min(next, interval.time_left)
48                 end
49
50                 if next == math.huge then
51                         return
52                 end
53
54                 if next > dtime then
55                         lua_async.socket.sleep(next - dtime)
56                 end
57         end
58 end