util.watchdog: Update to use "new" util.timer API
authorMatthew Wild <mwild1@gmail.com>
Sat, 11 Jun 2022 21:11:01 +0100
changeset 12549 5059a639f61e
parent 12548 00857bfa8ca2
child 12550 e78b35574aae
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.
util/watchdog.lua
--- a/util/watchdog.lua	Thu Jun 09 12:43:43 2022 +0100
+++ b/util/watchdog.lua	Sat Jun 11 21:11:01 2022 +0100
@@ -9,27 +9,30 @@
 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 {