aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2015-11-24 10:45:48 +0000
committerMatthew Wild <mwild1@gmail.com>2015-11-24 10:45:48 +0000
commita4f1ede8dc96076216f93c7e838019682669cce7 (patch)
treea12fa5909d7826b831a746e0f1d96bd354400959
parent1fc5ea9126bd146d6e6e4a9df51886155f551b76 (diff)
parent669071d1f3851308d80fb84af77f564c3dd0e034 (diff)
downloadprosody-a4f1ede8dc96076216f93c7e838019682669cce7.tar.gz
prosody-a4f1ede8dc96076216f93c7e838019682669cce7.zip
Merge
-rw-r--r--net/server_event.lua1
-rw-r--r--util/timer.lua24
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