A module to get the current time.
+Uses the most precise method available (in order:)
-## `gettime ( )`
+ - Use [ljsyscall](http://www.myriabit.com/ljsyscall/) to access
+ - `clock_gettime(2)` called with `CLOCK_REALTIME`
+ - `gettimeofday(2)`
+ - [luasocket](http://w3.impa.br/~diego/software/luasocket/)'s `socket.gettime`
+ - [`os.time`](http://www.lua.org/manual/5.2/manual.html#pdf-os.time)
-Uses the most precise method available (in order:)
+## `source`
+
+The library/function currently in use.
+
+## `resolution`
+
+The smallest time resolution (in seconds) available from `gettime ( )` .
+
+## `gettime ( )`
- - luasocket's `socket.gettime`
- - `os.time`
+Returns the number of seconds since unix epoch (1970-01-01T00:00:00Z) as a lua number
local _M = { }
-local has_socket , socket = pcall ( require , "socket" )
-if has_socket then
- _M.gettime = socket.gettime
-else
- _M.gettime = os.time
-end
+_M.source , _M.resolution , _M.gettime = (function()
+ local has_syscall , syscall = pcall ( require , "syscall" )
+ if has_syscall then
+ if syscall.clock_gettime 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
+ end
+ return "syscall.gettimeofday()" , 1e-6 ,
+ function ( )
+ return timeval_to_number ( syscall.gettimeofday ( ) )
+ end
+ end
+ 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
+
+ return "os.time()" , 1 , os.time
+end)()
return _M