X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Ftimer.lua;h=2277ee77b5025707cb0ce199a3071fa88b7f53bd;hb=127df5431789381b960207d7c853df2a4f1b9cc9;hp=e3158d8beb37764b96a3011744b1091f1902a744;hpb=bd62339074d5fe087ad6c5ee9507ca50793a03b8;p=prosody.git diff --git a/util/timer.lua b/util/timer.lua index e3158d8b..2277ee77 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -19,6 +19,8 @@ local _ENV = nil; local _add_task = server.add_task; +local _server_timer; +local _active_timers = 0; local h = indexedbheap.create(); local params = {}; local next_time = nil; @@ -42,10 +44,20 @@ local function _on_timer(now) params[_id] = _param; end end - next_time = peek; - if peek ~= nil then + + if peek ~= nil and _active_timers > 1 and peek == next_time then + -- Another instance of _on_timer already set next_time to the same value, + -- so it should be safe to not renew this timer event + peek = nil; + else + next_time = peek; + end + + if peek then + -- peek is the time of the next event return peek - now; end + _active_timers = _active_timers - 1; end local function add_task(delay, callback, param) local current_time = get_time(); @@ -55,13 +67,28 @@ local function add_task(delay, callback, param) params[id] = param; if next_time == nil or event_time < next_time then next_time = event_time; - _add_task(next_time - current_time, _on_timer); + if _server_timer then + _server_timer:close(); + _server_timer = nil; + else + _active_timers = _active_timers + 1; + end + _server_timer = _add_task(next_time - current_time, _on_timer); end return id; end local function stop(id) params[id] = nil; - return h:remove(id); + local result, item, result_sync = h:remove(id); + local peek = h:peek(); + if peek ~= next_time and _server_timer then + next_time = peek; + _server_timer:close(); + if next_time ~= nil then + _server_timer = _add_task(next_time - get_time(), _on_timer); + end + end + return result, item, result_sync; end local function reschedule(id, delay) local current_time = get_time();