util/watchdog.lua
author Kim Alvefur <zash@zash.se>
Mon, 12 Dec 2022 07:03:31 +0100
branch0.11
changeset 12802 c4b1b5cbc20b
parent 8558 4f0f5b49bb03
child 12549 5059a639f61e
permissions -rw-r--r--
Tag 0.11.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4401
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local timer = require "util.timer";
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
local setmetatable = setmetatable;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local os_time = os.time;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 4891
diff changeset
     5
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
     6
-- luacheck: std none
4401
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local watchdog_methods = {};
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local watchdog_mt = { __index = watchdog_methods };
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 4891
diff changeset
    11
local function new(timeout, callback)
4401
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	local watchdog = setmetatable({ timeout = timeout, last_reset = os_time(), callback = callback }, watchdog_mt);
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
	timer.add_task(timeout+1, function (current_time)
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
		local last_reset = watchdog.last_reset;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
		if not last_reset then
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
			return;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
		end
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
		local time_left = (last_reset + timeout) - current_time;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
		if time_left < 0 then
4891
189cfe565d03 util.watchdog: Pass watchdog object to callback so that it doesn't always have to be a closure
Matthew Wild <mwild1@gmail.com>
parents: 4401
diff changeset
    20
			return watchdog:callback();
4401
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		end
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
		return time_left + 1;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	end);
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
	return watchdog;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
end
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
function watchdog_methods:reset()
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
	self.last_reset = os_time();
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
end
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
function watchdog_methods:cancel()
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	self.last_reset = nil;
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
end
0ed617f58404 util.watchdog: Watchdog timer library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 4891
diff changeset
    35
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 4891
diff changeset
    36
	new = new;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 4891
diff changeset
    37
};