diff options
author | Matthew Wild <mwild1@gmail.com> | 2015-11-24 10:45:48 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2015-11-24 10:45:48 +0000 |
commit | 425f0ca2293d0778fea1060049e5b77f791a7ce5 (patch) | |
tree | a12fa5909d7826b831a746e0f1d96bd354400959 | |
parent | bb5b8e848bc1285f6a842aa781f94492cbcffc37 (diff) | |
parent | 628bbf628ab168f06c405f89b4b7fb084102a862 (diff) | |
download | prosody-425f0ca2293d0778fea1060049e5b77f791a7ce5.tar.gz prosody-425f0ca2293d0778fea1060049e5b77f791a7ce5.zip |
Merge
-rw-r--r-- | net/server_event.lua | 1 | ||||
-rw-r--r-- | util/timer.lua | 24 |
2 files changed, 22 insertions, 3 deletions
diff --git a/net/server_event.lua b/net/server_event.lua index 34cda026..9b1ffb25 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -807,6 +807,7 @@ local function add_task(delay, callback) end end , delay); + return event_handle; end return { diff --git a/util/timer.lua b/util/timer.lua index e3158d8b..eb2bd7ea 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,7 +67,13 @@ 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 |