aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordaurnimator <quae@daurnimator.com>2014-10-20 16:13:24 -0400
committerdaurnimator <quae@daurnimator.com>2014-10-20 16:13:24 -0400
commite51cc17dcbb1c6d8d614ff92ae48e412bf97fb73 (patch)
tree032ae646f40566f31102c4e76aacd8f843181945
parent54d833e318feb0a6b6b44af42a6241b79fc5bce7 (diff)
downloadprosody-e51cc17dcbb1c6d8d614ff92ae48e412bf97fb73.tar.gz
prosody-e51cc17dcbb1c6d8d614ff92ae48e412bf97fb73.zip
Move timer code out of util.timer and into relevant net.server backends
-rw-r--r--net/server_event.lua18
-rw-r--r--net/server_select.lua46
-rw-r--r--util/timer.lua67
3 files changed, 65 insertions, 66 deletions
diff --git a/net/server_event.lua b/net/server_event.lua
index 480d876d..fa6dda19 100644
--- a/net/server_event.lua
+++ b/net/server_event.lua
@@ -848,6 +848,23 @@ local function link(sender, receiver, buffersize)
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 @@ return {
closeall = closeallservers,
get_backend = get_backend,
hook_signal = hook_signal,
+ add_task = add_task,
__NAME = SCRIPT_NAME,
__DATE = LAST_MODIFIED,
diff --git a/net/server_select.lua b/net/server_select.lua
index 51449bdf..d8404001 100644
--- a/net/server_select.lua
+++ b/net/server_select.lua
@@ -42,6 +42,7 @@ local os_difftime = os.difftime
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 @@ addtimer = function( listener )
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 @@ end
return {
_addtimer = addtimer,
+ add_task = add_task;
addclient = addclient,
wrapclient = wrapclient,
diff --git a/util/timer.lua b/util/timer.lua
index 23bd6a37..0ec97585 100644
--- a/util/timer.lua
+++ b/util/timer.lua
@@ -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();