Uses the most precise method available (in order:)
- - Use [ljsyscall](http://www.myriabit.com/ljsyscall/) to access
- - `clock_gettime(2)` called with `CLOCK_REALTIME`
- - `gettimeofday(2)`
+ - Use [ljsyscall](http://www.myriabit.com/ljsyscall/) to access `clock_gettime(2)` called with `CLOCK_REALTIME`
+ - [lunix](http://25thandclement.com/~william/projects/lunix.html)'s `unix.clock_gettime()` (Only on non-Apple systems)
+ - Use [ljsyscall](http://www.myriabit.com/ljsyscall/) to access `gettimeofday(2)`
+ - [lunix](http://25thandclement.com/~william/projects/lunix.html)'s `unix.gettimeofday()`
- [luasocket](http://w3.impa.br/~diego/software/luasocket/)'s `socket.gettime`
- [Openresty](http://openresty.org/)'s [`ngx.now`](http://wiki.nginx.org/HttpLuaModule#ngx.now)
- [`os.time`](http://www.lua.org/manual/5.3/manual.html#pdf-os.time)
_M.source , _M.resolution , _M.gettime = (function()
local has_syscall , syscall = pcall ( require , "syscall" )
- if has_syscall then
- if 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
-
- elseif syscall.gettimeofday then
- local function timeval_to_number ( timeval )
- return tonumber ( timeval.tv_sec ) + tonumber ( timeval.tv_nsec ) * 1e-6
+ 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
- return "syscall.gettimeofday()" , 1e-6 ,
- function ( )
- return timeval_to_number ( syscall.gettimeofday ( ) )
- 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" )