Software /
code /
prosody
Comparison
util/timer.lua @ 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 |
parent | 5898:bf9aba718c01 |
child | 6791:e813e8cf6046 |
comparison
equal
deleted
inserted
replaced
6480:37b12475f648 | 6481:dbc72cd1332e |
---|---|
7 -- | 7 -- |
8 | 8 |
9 local indexedbheap = require "util.indexedbheap"; | 9 local indexedbheap = require "util.indexedbheap"; |
10 local log = require "util.logger".init("timer"); | 10 local log = require "util.logger".init("timer"); |
11 local server = require "net.server"; | 11 local server = require "net.server"; |
12 local math_min = math.min | |
13 local math_huge = math.huge | |
14 local get_time = require "socket".gettime; | 12 local get_time = require "socket".gettime; |
15 local t_insert = table.insert; | |
16 local pairs = pairs; | |
17 local type = type; | 13 local type = type; |
18 local debug_traceback = debug.traceback; | 14 local debug_traceback = debug.traceback; |
19 local tostring = tostring; | 15 local tostring = tostring; |
20 local xpcall = xpcall; | 16 local xpcall = xpcall; |
21 | 17 |
22 local data = {}; | |
23 local new_data = {}; | |
24 | |
25 module "timer" | 18 module "timer" |
26 | 19 |
27 local _add_task; | 20 local _add_task = server.add_task; |
28 if not server.event then | |
29 function _add_task(delay, callback) | |
30 local current_time = get_time(); | |
31 delay = delay + current_time; | |
32 if delay >= current_time then | |
33 t_insert(new_data, {delay, callback}); | |
34 else | |
35 local r = callback(current_time); | |
36 if r and type(r) == "number" then | |
37 return _add_task(r, callback); | |
38 end | |
39 end | |
40 end | |
41 | |
42 server._addtimer(function() | |
43 local current_time = get_time(); | |
44 if #new_data > 0 then | |
45 for _, d in pairs(new_data) do | |
46 t_insert(data, d); | |
47 end | |
48 new_data = {}; | |
49 end | |
50 | |
51 local next_time = math_huge; | |
52 for i, d in pairs(data) do | |
53 local t, callback = d[1], d[2]; | |
54 if t <= current_time then | |
55 data[i] = nil; | |
56 local r = callback(current_time); | |
57 if type(r) == "number" then | |
58 _add_task(r, callback); | |
59 next_time = math_min(next_time, r); | |
60 end | |
61 else | |
62 next_time = math_min(next_time, t - current_time); | |
63 end | |
64 end | |
65 return next_time; | |
66 end); | |
67 else | |
68 local event = server.event; | |
69 local event_base = server.event_base; | |
70 local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1; | |
71 | |
72 function _add_task(delay, callback) | |
73 local event_handle; | |
74 event_handle = event_base:addevent(nil, 0, function () | |
75 local ret = callback(get_time()); | |
76 if ret then | |
77 return 0, ret; | |
78 elseif event_handle then | |
79 return EVENT_LEAVE; | |
80 end | |
81 end | |
82 , delay); | |
83 end | |
84 end | |
85 | |
86 --add_task = _add_task; | 21 --add_task = _add_task; |
87 | 22 |
88 local h = indexedbheap.create(); | 23 local h = indexedbheap.create(); |
89 local params = {}; | 24 local params = {}; |
90 local next_time = nil; | 25 local next_time = nil; |