mod_adhoc: Add support for commands only executable by global administrators
[prosody.git] / util / timer.lua
index c52d9c68bb2ff81e2d093f9d55a0e6a3baa10f47..3061da725384ce6d7a0a3d3e7462441e71ef1692 100644 (file)
@@ -1,6 +1,6 @@
 -- Prosody IM
--- Copyright (C) 2008-2009 Matthew Wild
--- Copyright (C) 2008-2009 Waqas Hussain
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
 -- 
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
@@ -11,7 +11,9 @@ local ns_addtimer = require "net.server".addtimer;
 local event = require "net.server".event;
 local event_base = require "net.server".event_base;
 
-local get_time = os.time;
+local math_min = math.min
+local math_huge = math.huge
+local get_time = require "socket".gettime;
 local t_insert = table.insert;
 local t_remove = table.remove;
 local ipairs, pairs = ipairs, pairs;
@@ -43,23 +45,31 @@ if not event then
                        new_data = {};
                end
                
+               local next_time = math_huge;
                for i, d in pairs(data) do
                        local t, func = d[1], d[2];
                        if t <= current_time then
                                data[i] = nil;
                                local r = func(current_time);
-                               if type(r) == "number" then _add_task(r, func); end
+                               if type(r) == "number" then
+                                       _add_task(r, func);
+                                       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_LEAVE = (event.core and event.core.LEAVE) or -1;
        function _add_task(delay, func)
-               event_base:addevent(nil, 0, function ()
+               local event_handle;
+               event_handle = event_base:addevent(nil, 0, function ()
                        local ret = func();
                        if ret then
                                return 0, ret;
-                       else
+                       elseif event_handle then
                                return EVENT_LEAVE;
                        end
                end