diff options
author | Matthew Wild <mwild1@gmail.com> | 2009-02-26 21:00:42 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2009-02-26 21:00:42 +0000 |
commit | d2631d39ca278c6823ffc6e19a670954507c981b (patch) | |
tree | 94d5b5b36b5167b5a094294373099b20867dd308 /util/timer.lua | |
parent | b9636951c1d64ec398a18a40b55ff92d83f50009 (diff) | |
download | prosody-d2631d39ca278c6823ffc6e19a670954507c981b.tar.gz prosody-d2631d39ca278c6823ffc6e19a670954507c981b.zip |
util.timer: Fix crash when loaded but no tasks set, fix skipping some tasks when multiple set, and one removed
Diffstat (limited to 'util/timer.lua')
-rw-r--r-- | util/timer.lua | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/util/timer.lua b/util/timer.lua index 889a8c4c..8bb1c115 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -10,7 +10,8 @@ local ns_addtimer = require "net.server".addtimer; local get_time = os.time; local t_insert = table.insert; -local ipairs = ipairs; +local t_remove = table.remove; +local ipairs, pairs = ipairs, pairs; local type = type; local data = {}; @@ -30,14 +31,19 @@ add_task = _add_task; ns_addtimer(function() local current_time = get_time(); - for _, d in ipairs(new_data) do - t_insert(data, d); + if #new_data > 0 then + for _, d in ipairs(new_data) do + t_insert(data, d); + end + new_data = {}; + elseif #data == 0 then + return; end - new_data = {}; - for i = #data,1 do - local t, func = data[i][1], data[i][2]; + + for i, d in pairs(data) do + local t, func = d[1], d[2]; if t <= current_time then - data[i] = nil; + t_remove(data, i); local r = func(); if type(r) == "number" then _add_task(r, func); end end |