Files
2026-07-13 12:32:21 +08:00

107 lines
2.1 KiB
Lua

local ffi = require "ffi"
local C = ffi.C
local tonumber = tonumber
ffi.cdef[[
typedef long time_t;
typedef int clockid_t;
typedef struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
} nanotime;
int clock_gettime(clockid_t clk_id, struct timespec *tp);
]]
local _M = {}
do
local NGX_ERROR = ngx.ERROR
if not pcall(ffi.typeof, "ngx_uint_t") then
ffi.cdef [[
typedef uintptr_t ngx_uint_t;
]]
end
if not pcall(ffi.typeof, "ngx_int_t") then
ffi.cdef [[
typedef intptr_t ngx_int_t;
]]
end
-- ngx_str_t defined by lua-resty-core
local s = ffi.new("ngx_str_t[1]")
s[0].data = "10"
s[0].len = 2
if not pcall(function() C.ngx_parse_time(s, 0) end) then
ffi.cdef [[
ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec);
]]
end
function _M.nginx_conf_time_to_seconds(str)
s[0].data = str
s[0].len = #str
local ret = C.ngx_parse_time(s, 1)
if ret == NGX_ERROR then
error("bad argument #1 'str'", 2)
end
return tonumber(ret, 10)
end
end
do
local nanop = ffi.new("nanotime[1]")
function _M.time_ns()
-- CLOCK_REALTIME -> 0
C.clock_gettime(0, nanop)
local t = nanop[0]
return tonumber(t.tv_sec) * 1e9 + tonumber(t.tv_nsec)
end
end
do
local now = ngx.now
local update_time = ngx.update_time
local start_time = ngx.req.start_time
local monotonic_msec = require("resty.core.time").monotonic_msec
function _M.get_updated_now()
update_time()
return now() -- time is kept in seconds with millisecond resolution.
end
function _M.get_now_ms()
return now() * 1000 -- time is kept in seconds with millisecond resolution.
end
function _M.get_updated_now_ms()
update_time()
return now() * 1000 -- time is kept in seconds with millisecond resolution.
end
function _M.get_start_time_ms()
return start_time() * 1000 -- time is kept in seconds with millisecond resolution.
end
function _M.get_updated_monotonic_ms()
update_time()
return monotonic_msec()
end
end
return _M