45 lines
1.4 KiB
Lua
45 lines
1.4 KiB
Lua
-- SPDX-License-Identifier: GPL-3.0-or-later
|
|
-- Module interface
|
|
local ffi = require('ffi')
|
|
|
|
local mod = {}
|
|
mod.threshold = 10 * min
|
|
local event_id = nil
|
|
|
|
-- Get time of last cache clear. Compute difference between realtime
|
|
-- and monotonic time. Compute difference of actual realtime and monotonic
|
|
-- time. In ideal case these differences should be almost same.
|
|
-- If they differ more than mod.threshold value then clear cache.
|
|
local function check_time()
|
|
local checkpoint = cache.checkpoint()
|
|
local cache_timeshift = checkpoint.walltime.sec * 1000 - checkpoint.monotime
|
|
local actual_timeshift = os.time() * 1000 - tonumber(ffi.C.kr_now())
|
|
local jump_backward = cache_timeshift - actual_timeshift
|
|
if jump_backward > mod.threshold then
|
|
log_info(ffi.C.LOG_GRP_DETECTTIMEJUMP, "Detected backwards time jump, clearing cache.\n" ..
|
|
"But what does that mean? It means your future hasn't been written yet."
|
|
)
|
|
cache.clear()
|
|
elseif -jump_backward > mod.threshold then
|
|
-- On Linux 4.17+ this shouldn't happen anymore: https://lwn.net/Articles/751482/
|
|
log_info(ffi.C.LOG_GRP_DETECTTIMEJUMP, "Detected forward time jump. (Suspend-resume, possibly.)")
|
|
cache.checkpoint(true)
|
|
end
|
|
end
|
|
|
|
function mod.init()
|
|
if event_id then
|
|
error("Module is already loaded.")
|
|
else
|
|
event_id = event.recurrent(1 * min , check_time)
|
|
end
|
|
end
|
|
|
|
function mod.deinit()
|
|
if event_id then
|
|
event.cancel(event_id)
|
|
event_id = nil
|
|
end
|
|
end
|
|
|
|
return mod
|