From f36aa3f1cc01b596038530abf77fcdb29ba5acfc Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 11 Mar 2017 15:00:32 +1100 Subject: [PATCH] luatz/gettime: Use lunix if available --- doc/gettime.md | 7 ++++--- luatz/gettime.lua | 49 +++++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/doc/gettime.md b/doc/gettime.md index a31e5a0..3550577 100644 --- a/doc/gettime.md +++ b/doc/gettime.md @@ -4,9 +4,10 @@ A module to get the current time. 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) diff --git a/luatz/gettime.lua b/luatz/gettime.lua index b5dec5a..d3eee80 100644 --- a/luatz/gettime.lua +++ b/luatz/gettime.lua @@ -2,27 +2,38 @@ local _M = { } _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" ) -- 2.39.2