From 97ea70c7d325fcdd6342a84464e9b7b26d9da177 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sat, 21 Feb 2009 01:13:53 +0500 Subject: Added util/timer.lua - a timer API --- util/timer.lua | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 util/timer.lua (limited to 'util/timer.lua') diff --git a/util/timer.lua b/util/timer.lua new file mode 100644 index 00000000..889a8c4c --- /dev/null +++ b/util/timer.lua @@ -0,0 +1,47 @@ +-- Prosody IM v0.3 +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 Waqas Hussain +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + + +local ns_addtimer = require "net.server".addtimer; +local get_time = os.time; +local t_insert = table.insert; +local ipairs = ipairs; +local type = type; + +local data = {}; +local new_data = {}; + +module "timer" + +local function _add_task(delay, func) + local current_time = get_time(); + delay = delay + current_time; + if delay >= current_time then + t_insert(new_data, {delay, func}); + else func(); end +end + +add_task = _add_task; + +ns_addtimer(function() + local current_time = get_time(); + for _, d in ipairs(new_data) do + t_insert(data, d); + end + new_data = {}; + for i = #data,1 do + local t, func = data[i][1], data[i][2]; + if t <= current_time then + data[i] = nil; + local r = func(); + if type(r) == "number" then _add_task(r, func); end + end + end +end); + +return _M; -- cgit v1.2.3 From d2631d39ca278c6823ffc6e19a670954507c981b Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Feb 2009 21:00:42 +0000 Subject: util.timer: Fix crash when loaded but no tasks set, fix skipping some tasks when multiple set, and one removed --- util/timer.lua | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'util/timer.lua') 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 -- cgit v1.2.3 From 0c8bb8e89f63fe33e7a320e5d8bb308c1ba80192 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Feb 2009 22:17:55 +0000 Subject: util.timer: More small fixes I forgot to commit --- util/timer.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'util/timer.lua') diff --git a/util/timer.lua b/util/timer.lua index 8bb1c115..3db66832 100644 --- a/util/timer.lua +++ b/util/timer.lua @@ -32,18 +32,16 @@ add_task = _add_task; ns_addtimer(function() local current_time = get_time(); if #new_data > 0 then - for _, d in ipairs(new_data) do + for _, d in pairs(new_data) do t_insert(data, d); end new_data = {}; - elseif #data == 0 then - return; end for i, d in pairs(data) do local t, func = d[1], d[2]; if t <= current_time then - t_remove(data, i); + data[i] = nil; local r = func(); if type(r) == "number" then _add_task(r, func); end end -- cgit v1.2.3