Software /
code /
prosody
Changeset
6481:dbc72cd1332e
Move timer code out of util.timer and into relevant net.server backends
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Mon, 20 Oct 2014 16:13:24 -0400 |
parents | 6480:37b12475f648 |
children | 6482:410067cdeb2f |
files | net/server_event.lua net/server_select.lua util/timer.lua |
diffstat | 3 files changed, 65 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- 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();