From: daurnimator Date: Tue, 15 Jul 2014 22:12:27 +0000 (-0400) Subject: {luatz,doc}/gettime: Add ljsyscall as a source. Better docs. X-Git-Url: https://git.madduck.net/etc/awesome.git/commitdiff_plain/98b26721ede0c7f2015bcf72ae8e61f100507de3 {luatz,doc}/gettime: Add ljsyscall as a source. Better docs. --- diff --git a/doc/gettime.md b/doc/gettime.md index 758be60..2e3ef35 100644 --- a/doc/gettime.md +++ b/doc/gettime.md @@ -2,10 +2,22 @@ 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 diff --git a/luatz/gettime.lua b/luatz/gettime.lua index a86829e..008e95c 100644 --- a/luatz/gettime.lua +++ b/luatz/gettime.lua @@ -1,10 +1,38 @@ 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