X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/e5c87b4489b0881b7b9903733478f0d11ac96ab7..b810c29ea3652ed987ae54eb56baa79bf24311af:/luatz/gettime.lua?ds=sidebyside

diff --git a/luatz/gettime.lua b/luatz/gettime.lua
index a86829e..4d6f45a 100644
--- a/luatz/gettime.lua
+++ b/luatz/gettime.lua
@@ -1,10 +1,53 @@
-local _M = { }
-
-local has_socket , socket = pcall ( require , "socket" )
-if has_socket then
-	_M.gettime = socket.gettime
-else
-	_M.gettime = os.time
-end
+local _M = {}
+
+_M.source, _M.resolution, _M.gettime = (function()
+	local has_syscall, syscall = pcall(require, "syscall")
+	if has_syscall and syscall.clock_gettime and syscall.c.CLOCK then
+		local clock_id = syscall.c.CLOCK.REALTIME
+		local function timespec_to_number(timespec)
+			return tonumber(timespec.tv_sec) + tonumber(timespec.tv_nsec) * 1e-9
+		end
+		return "syscall.clock_gettime(CLOCK_REALTIME)",
+			syscall.clock_getres and timespec_to_number(syscall.clock_getres(clock_id)) or 1e-9,
+			function()
+				return timespec_to_number(syscall.clock_gettime(clock_id))
+			end
+	end
+
+	local has_unix, unix = pcall(require, "unix")
+	-- On Apple devices lunix only uses gettimeofday()
+	if has_unix and unix.clock_gettime and unix.uname and unix.uname().sysname ~= "Darwin" then
+		return "unix.clock_gettime(CLOCK_REALTIME)", 1e-9, function()
+			return unix.clock_gettime()
+		end
+	end
+
+	if has_syscall and syscall.gettimeofday then
+		local function timeval_to_number(timeval)
+			return tonumber(timeval.tv_sec) + tonumber(timeval.tv_nsec) * 1e-6
+		end
+		return "syscall.gettimeofday()", 1e-6,
+			function()
+				return timeval_to_number(syscall.gettimeofday())
+			end
+	end
+
+	if has_unix and unix.gettimeofday then
+		return "unix.gettimeofday()", 1e-6, unix.gettimeofday
+	end
+
+	local has_socket, socket = pcall(require, "socket")
+	if has_socket and socket.gettime then
+		-- on windows, this uses GetSystemTimeAsFileTime, which has resolution of 1e-7
+		-- on linux, this uses gettimeofday, which has resolution of 1e-6
+		return "socket.gettime()", 1e-6, socket.gettime
+	end
+
+	if ngx and ngx.now then -- luacheck: ignore 113
+		return "ngx.now()", 1e-3, ngx.now -- luacheck: ignore 113
+	end
+
+	return "os.time()", 1, os.time
+end)()
 
 return _M