aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2022-06-11 21:11:01 +0100
committerMatthew Wild <mwild1@gmail.com>2022-06-11 21:11:01 +0100
commit49a9d5e4274c26272761656d3fdaa6b2509c90f5 (patch)
treed47be96ee4710acebfbe4f1e910c59b603d46d57
parent325900b248f8e89cdcf43d6edf66fa5a30d930d2 (diff)
downloadprosody-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.lua29
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 {