diff options
author | Matthew Wild <mwild1@gmail.com> | 2022-06-11 21:11:01 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2022-06-11 21:11:01 +0100 |
commit | 49a9d5e4274c26272761656d3fdaa6b2509c90f5 (patch) | |
tree | d47be96ee4710acebfbe4f1e910c59b603d46d57 | |
parent | 325900b248f8e89cdcf43d6edf66fa5a30d930d2 (diff) | |
download | prosody-49a9d5e4274c26272761656d3fdaa6b2509c90f5.tar.gz prosody-49a9d5e4274c26272761656d3fdaa6b2509c90f5.zip |
util.watchdog: Update to use "new" util.timer API
When this module was written, it wasn't possible to cancel or reschedule a
timer. Times have changed, and we should take advantage of those new methods.
This module becomes a very thin wrapper around util.timer now, but I'd argue
it's still a very common and useful concept/abstraction to have around.
Possible API change: this removes the 'last_reset' field of the watchdog. This
was never really intended as a public thing, and I can't find any code that
uses it, so I consider removal to be safe.
-rw-r--r-- | util/watchdog.lua | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/util/watchdog.lua b/util/watchdog.lua index 516e60e4..1d30f22b 100644 --- a/util/watchdog.lua +++ b/util/watchdog.lua @@ -9,27 +9,30 @@ local watchdog_methods = {}; local watchdog_mt = { __index = watchdog_methods }; local function new(timeout, callback) - local watchdog = setmetatable({ timeout = timeout, last_reset = os_time(), callback = callback }, watchdog_mt); - timer.add_task(timeout+1, function (current_time) - local last_reset = watchdog.last_reset; - if not last_reset then - return; - end - local time_left = (last_reset + timeout) - current_time; - if time_left < 0 then - return watchdog:callback(); - end - return time_left + 1; + local watchdog = setmetatable({ + timeout = timeout; + callback = callback; + timer_id = nil; + }, watchdog_mt); + + watchdog.timer_id = timer.add_task(timeout+1, function () + return watchdog:callback(); end); + return watchdog; end function watchdog_methods:reset() - self.last_reset = os_time(); + if self.timer_id then + timer.reschedule(self.timer_id, self.timeout); + end end function watchdog_methods:cancel() - self.last_reset = nil; + if self.timer_id then + timer.stop(self.timer_id); + self.timer_id = nil; + end end return { |