Mercurial > prosody-hg
comparison util/timer.lua @ 11264:2cdcf55c6dd5
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 08 Jan 2021 23:56:27 +0100 |
| parents | e6c1e92cc7a7 1274deeab39a |
| children | d10957394a3c |
comparison
equal
deleted
inserted
replaced
| 11260:08b397c21805 | 11264:2cdcf55c6dd5 |
|---|---|
| 13 local type = type; | 13 local type = type; |
| 14 local debug_traceback = debug.traceback; | 14 local debug_traceback = debug.traceback; |
| 15 local tostring = tostring; | 15 local tostring = tostring; |
| 16 local xpcall = require "util.xpcall".xpcall; | 16 local xpcall = require "util.xpcall".xpcall; |
| 17 local math_max = math.max; | 17 local math_max = math.max; |
| 18 local pairs = pairs; | |
| 18 | 19 |
| 19 if server.timer then | 20 if server.timer then |
| 20 -- The selected net.server implements this API, so defer to that | 21 -- The selected net.server implements this API, so defer to that |
| 21 return server.timer; | 22 return server.timer; |
| 22 end | 23 end |
| 32 local params = {}; | 33 local params = {}; |
| 33 local next_time = nil; | 34 local next_time = nil; |
| 34 local function _traceback_handler(err) log("error", "Traceback[timer]: %s", debug_traceback(tostring(err), 2)); end | 35 local function _traceback_handler(err) log("error", "Traceback[timer]: %s", debug_traceback(tostring(err), 2)); end |
| 35 local function _on_timer(now) | 36 local function _on_timer(now) |
| 36 local peek; | 37 local peek; |
| 38 local readd; | |
| 37 while true do | 39 while true do |
| 38 peek = h:peek(); | 40 peek = h:peek(); |
| 39 if peek == nil or peek > now then break; end | 41 if peek == nil or peek > now then break; end |
| 40 local _, callback, id = h:pop(); | 42 local _, callback, id = h:pop(); |
| 41 local param = params[id]; | 43 local param = params[id]; |
| 42 params[id] = nil; | 44 params[id] = nil; |
| 43 --item(now, id, _param); | 45 --item(now, id, _param); |
| 44 local success, err = xpcall(callback, _traceback_handler, now, id, param); | 46 local success, err = xpcall(callback, _traceback_handler, now, id, param); |
| 45 if success and type(err) == "number" then | 47 if success and type(err) == "number" then |
| 46 h:insert(callback, err + now, id); -- re-add | 48 if readd then |
| 49 readd[id] = { callback, err + now }; | |
| 50 else | |
| 51 readd = { [id] = { callback, err + now } }; | |
| 52 end | |
| 47 params[id] = param; | 53 params[id] = param; |
| 48 end | 54 end |
| 55 end | |
| 56 | |
| 57 if readd then | |
| 58 for id,timer in pairs(readd) do | |
| 59 h:insert(timer[1], timer[2], id); | |
| 60 end | |
| 61 peek = h:peek(); | |
| 49 end | 62 end |
| 50 | 63 |
| 51 if peek ~= nil and _active_timers > 1 and peek == next_time then | 64 if peek ~= nil and _active_timers > 1 and peek == next_time then |
| 52 -- Another instance of _on_timer already set next_time to the same value, | 65 -- Another instance of _on_timer already set next_time to the same value, |
| 53 -- so it should be safe to not renew this timer event | 66 -- so it should be safe to not renew this timer event |
