From 5cc2151af1a06d291e26ca4ae4574e45c2a04492 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sun, 22 Nov 2015 17:00:43 +0100 Subject: net.server_event: Return event handle from add_task so it can be closed by eg util.timer --- net/server_event.lua | 1 + 1 file changed, 1 insertion(+) 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 { -- cgit v1.2.3 From dfe8a2fd7df0215f3e74c9bedcb9a8e9aa36c8c0 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sun, 22 Nov 2015 17:18:29 +0100 Subject: util.timer: Keep count of how many timer instances are active --- util/timer.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/timer.lua b/util/timer.lua index e3158d8b..9042264d 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -19,6 +19,7 @@ local _ENV = nil; local _add_task = server.add_task; +local _active_timers = 0; local h = indexedbheap.create(); local params = {}; local next_time = nil; @@ -46,6 +47,7 @@ local function _on_timer(now) if peek ~= nil then return peek - now; end + _active_timers = _active_timers - 1; end local function add_task(delay, callback, param) local current_time = get_time(); @@ -55,6 +57,7 @@ local function add_task(delay, callback, param) params[id] = param; if next_time == nil or event_time < next_time then next_time = event_time; + _active_timers = _active_timers + 1; _add_task(next_time - current_time, _on_timer); end return id; -- cgit v1.2.3 From 13c5628054e17a8f7f2402e81e8198ab52558dea Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sun, 22 Nov 2015 17:20:20 +0100 Subject: util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event --- util/timer.lua | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/util/timer.lua b/util/timer.lua index 9042264d..78b4dbd7 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -43,8 +43,17 @@ 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; -- cgit v1.2.3 From 628bbf628ab168f06c405f89b4b7fb084102a862 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sun, 22 Nov 2015 17:25:44 +0100 Subject: util.timer: If possible, close the existing timer handle in order to have only one --- util/timer.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/timer.lua b/util/timer.lua index 78b4dbd7..eb2bd7ea 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -19,6 +19,7 @@ local _ENV = nil; local _add_task = server.add_task; +local _server_timer; local _active_timers = 0; local h = indexedbheap.create(); local params = {}; @@ -66,8 +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; - _active_timers = _active_timers + 1; - _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 -- cgit v1.2.3