diff options
author | Matthew Wild <mwild1@gmail.com> | 2011-10-21 17:12:45 -0400 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2011-10-21 17:12:45 -0400 |
commit | c5a40fd34711a8cb7e978146e5429c7a2daa0f5c (patch) | |
tree | 109749f485021ffbb405a19c7b570db1353645f2 /util | |
parent | 97a0b9f7add62ba930172193cdc2cc504e445422 (diff) | |
download | prosody-c5a40fd34711a8cb7e978146e5429c7a2daa0f5c.tar.gz prosody-c5a40fd34711a8cb7e978146e5429c7a2daa0f5c.zip |
util.watchdog: Watchdog timer library
Diffstat (limited to 'util')
-rw-r--r-- | util/watchdog.lua | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/util/watchdog.lua b/util/watchdog.lua new file mode 100644 index 00000000..96031415 --- /dev/null +++ b/util/watchdog.lua @@ -0,0 +1,34 @@ +local timer = require "util.timer"; +local setmetatable = setmetatable; +local os_time = os.time; + +module "watchdog" + +local watchdog_methods = {}; +local watchdog_mt = { __index = watchdog_methods }; + +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; + end); + return watchdog; +end + +function watchdog_methods:reset() + self.last_reset = os_time(); +end + +function watchdog_methods:cancel() + self.last_reset = nil; +end + +return _M; |