Software /
code /
prosody
Comparison
util/timer.lua @ 841:77ff000c2055
util.timer: Fix crash when loaded but no tasks set, fix skipping some tasks when multiple set, and one removed
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 26 Feb 2009 21:00:42 +0000 |
parent | 832:282ae70db19f |
child | 842:4932f94d35c1 |
comparison
equal
deleted
inserted
replaced
840:ad842df925c7 | 841:77ff000c2055 |
---|---|
8 | 8 |
9 | 9 |
10 local ns_addtimer = require "net.server".addtimer; | 10 local ns_addtimer = require "net.server".addtimer; |
11 local get_time = os.time; | 11 local get_time = os.time; |
12 local t_insert = table.insert; | 12 local t_insert = table.insert; |
13 local ipairs = ipairs; | 13 local t_remove = table.remove; |
14 local ipairs, pairs = ipairs, pairs; | |
14 local type = type; | 15 local type = type; |
15 | 16 |
16 local data = {}; | 17 local data = {}; |
17 local new_data = {}; | 18 local new_data = {}; |
18 | 19 |
28 | 29 |
29 add_task = _add_task; | 30 add_task = _add_task; |
30 | 31 |
31 ns_addtimer(function() | 32 ns_addtimer(function() |
32 local current_time = get_time(); | 33 local current_time = get_time(); |
33 for _, d in ipairs(new_data) do | 34 if #new_data > 0 then |
34 t_insert(data, d); | 35 for _, d in ipairs(new_data) do |
36 t_insert(data, d); | |
37 end | |
38 new_data = {}; | |
39 elseif #data == 0 then | |
40 return; | |
35 end | 41 end |
36 new_data = {}; | 42 |
37 for i = #data,1 do | 43 for i, d in pairs(data) do |
38 local t, func = data[i][1], data[i][2]; | 44 local t, func = d[1], d[2]; |
39 if t <= current_time then | 45 if t <= current_time then |
40 data[i] = nil; | 46 t_remove(data, i); |
41 local r = func(); | 47 local r = func(); |
42 if type(r) == "number" then _add_task(r, func); end | 48 if type(r) == "number" then _add_task(r, func); end |
43 end | 49 end |
44 end | 50 end |
45 end); | 51 end); |