Changeset

6935:d12917643e65

Merge
author Matthew Wild <mwild1@gmail.com>
date Tue, 24 Nov 2015 10:45:48 +0000
parents 6934:5d913559d092 (current diff) 6932:f5fd2c5cdf28 (diff)
children 6936:2ca1d54d4b92
files
diffstat 2 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/net/server_event.lua	Tue Nov 24 10:45:15 2015 +0000
+++ b/net/server_event.lua	Tue Nov 24 10:45:48 2015 +0000
@@ -807,6 +807,7 @@
 		end
 	end
 	, delay);
+	return event_handle;
 end
 
 return {
--- a/util/timer.lua	Tue Nov 24 10:45:15 2015 +0000
+++ b/util/timer.lua	Tue Nov 24 10:45:48 2015 +0000
@@ -19,6 +19,8 @@
 
 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 @@
 			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 @@
 	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