Move timer code out of util.timer and into relevant net.server backends
authordaurnimator <quae@daurnimator.com>
Mon, 20 Oct 2014 16:13:24 -0400
changeset 6484 dbc72cd1332e
parent 6483 37b12475f648
child 6485 410067cdeb2f
Move timer code out of util.timer and into relevant net.server backends
net/server_event.lua
net/server_select.lua
util/timer.lua
--- a/net/server_event.lua	Fri Oct 17 17:30:21 2014 -0400
+++ b/net/server_event.lua	Mon Oct 20 16:13:24 2014 -0400
@@ -848,6 +848,23 @@
 	sender:set_mode("*a");
 end
 
+local add_task do
+	local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1;
+	local socket_gettime = socket.gettime
+	function add_task(delay, callback)
+		local event_handle;
+		event_handle = base:addevent(nil, 0, function ()
+			local ret = callback(socket_gettime());
+			if ret then
+				return 0, ret;
+			elseif event_handle then
+				return EVENT_LEAVE;
+			end
+		end
+		, delay);
+	end
+end
+
 return {
 
 	cfg = cfg,
@@ -864,6 +881,7 @@
 	closeall = closeallservers,
 	get_backend = get_backend,
 	hook_signal = hook_signal,
+	add_task = add_task,
 
 	__NAME = SCRIPT_NAME,
 	__DATE = LAST_MODIFIED,
--- a/net/server_select.lua	Fri Oct 17 17:30:21 2014 -0400
+++ b/net/server_select.lua	Mon Oct 20 16:13:24 2014 -0400
@@ -42,6 +42,7 @@
 local math_min = math.min
 local math_huge = math.huge
 local table_concat = table.concat
+local table_insert = table.insert
 local string_sub = string.sub
 local coroutine_wrap = coroutine.wrap
 local coroutine_yield = coroutine.yield
@@ -832,6 +833,50 @@
 	return true
 end
 
+local add_task do
+	local data = {};
+	local new_data = {};
+
+	function add_task(delay, callback)
+		local current_time = luasocket_gettime();
+		delay = delay + current_time;
+		if delay >= current_time then
+			table_insert(new_data, {delay, callback});
+		else
+			local r = callback(current_time);
+			if r and type(r) == "number" then
+				return add_task(r, callback);
+			end
+		end
+	end
+
+	addtimer(function()
+		local current_time = luasocket_gettime();
+		if #new_data > 0 then
+			for _, d in pairs(new_data) do
+				table_insert(data, d);
+			end
+			new_data = {};
+		end
+
+		local next_time = math_huge;
+		for i, d in pairs(data) do
+			local t, callback = d[1], d[2];
+			if t <= current_time then
+				data[i] = nil;
+				local r = callback(current_time);
+				if type(r) == "number" then
+					add_task(r, callback);
+					next_time = math_min(next_time, r);
+				end
+			else
+				next_time = math_min(next_time, t - current_time);
+			end
+		end
+		return next_time;
+	end);
+end
+
 stats = function( )
 	return _readtraffic, _sendtraffic, _readlistlen, _sendlistlen, _timerlistlen
 end
@@ -1007,6 +1052,7 @@
 
 return {
 	_addtimer = addtimer,
+	add_task = add_task;
 
 	addclient = addclient,
 	wrapclient = wrapclient,
--- a/util/timer.lua	Fri Oct 17 17:30:21 2014 -0400
+++ b/util/timer.lua	Mon Oct 20 16:13:24 2014 -0400
@@ -9,80 +9,15 @@
 local indexedbheap = require "util.indexedbheap";
 local log = require "util.logger".init("timer");
 local server = require "net.server";
-local math_min = math.min
-local math_huge = math.huge
 local get_time = require "socket".gettime;
-local t_insert = table.insert;
-local pairs = pairs;
 local type = type;
 local debug_traceback = debug.traceback;
 local tostring = tostring;
 local xpcall = xpcall;
 
-local data = {};
-local new_data = {};
-
 module "timer"
 
-local _add_task;
-if not server.event then
-	function _add_task(delay, callback)
-		local current_time = get_time();
-		delay = delay + current_time;
-		if delay >= current_time then
-			t_insert(new_data, {delay, callback});
-		else
-			local r = callback(current_time);
-			if r and type(r) == "number" then
-				return _add_task(r, callback);
-			end
-		end
-	end
-
-	server._addtimer(function()
-		local current_time = get_time();
-		if #new_data > 0 then
-			for _, d in pairs(new_data) do
-				t_insert(data, d);
-			end
-			new_data = {};
-		end
-
-		local next_time = math_huge;
-		for i, d in pairs(data) do
-			local t, callback = d[1], d[2];
-			if t <= current_time then
-				data[i] = nil;
-				local r = callback(current_time);
-				if type(r) == "number" then
-					_add_task(r, callback);
-					next_time = math_min(next_time, r);
-				end
-			else
-				next_time = math_min(next_time, t - current_time);
-			end
-		end
-		return next_time;
-	end);
-else
-	local event = server.event;
-	local event_base = server.event_base;
-	local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1;
-
-	function _add_task(delay, callback)
-		local event_handle;
-		event_handle = event_base:addevent(nil, 0, function ()
-			local ret = callback(get_time());
-			if ret then
-				return 0, ret;
-			elseif event_handle then
-				return EVENT_LEAVE;
-			end
-		end
-		, delay);
-	end
-end
-
+local _add_task = server.add_task;
 --add_task = _add_task;
 
 local h = indexedbheap.create();