util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)

Sat, 21 Nov 2009 02:40:21 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 21 Nov 2009 02:40:21 +0000
changeset 2095
3256c5d00901
parent 2094
c69cb5c171e0
child 2096
7d2f3ef5aa83

util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)

util/timer.lua file | annotate | diff | comparison | revisions
--- a/util/timer.lua	Sat Nov 21 02:39:08 2009 +0000
+++ b/util/timer.lua	Sat Nov 21 02:40:21 2009 +0000
@@ -8,6 +8,8 @@
 
 
 local ns_addtimer = require "net.server".addtimer;
+local event = require "net.server".event;
+
 local get_time = os.time;
 local t_insert = table.insert;
 local t_remove = table.remove;
@@ -19,33 +21,51 @@
 
 module "timer"
 
-local function _add_task(delay, func)
-	local current_time = get_time();
-	delay = delay + current_time;
-	if delay >= current_time then
-		t_insert(new_data, {delay, func});
-	else func(); end
+local _add_task;
+if not event then
+	function _add_task(delay, func)
+		local current_time = get_time();
+		delay = delay + current_time;
+		if delay >= current_time then
+			t_insert(new_data, {delay, func});
+		else
+			func();
+		end
+	end
+
+	ns_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
+		
+		for i, d in pairs(data) do
+			local t, func = d[1], d[2];
+			if t <= current_time then
+				data[i] = nil;
+				local r = func(current_time);
+				if type(r) == "number" then _add_task(r, func); end
+			end
+		end
+	end);
+else
+	local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1;
+	function _add_task(delay, func)
+		event.base:addevent(nil, event.EV_TIMEOUT, function ()
+			local ret = func();
+			if ret then
+				_add_task(ret, func);
+			else
+				return EVENT_LEAVE;
+			end
+		end
+		, delay);
+	end
 end
 
 add_task = _add_task;
 
-ns_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
-	
-	for i, d in pairs(data) do
-		local t, func = d[1], d[2];
-		if t <= current_time then
-			data[i] = nil;
-			local r = func(current_time);
-			if type(r) == "number" then _add_task(r, func); end
-		end
-	end
-end);
-
 return _M;

mercurial