(foreign-declare "#include ") (define get-nanosecs (foreign-lambda* unsigned-integer64 () "uint64_t time = clock_gettime_nsec_np( CLOCK_UPTIME_RAW );" "if( 0 == time ) return( 0 );" "return( time );")) #| ;pre-Sierra 10.12 (foreign-declare "#include ") (define get-nanosecs) (let ((%factor 0.0)) (define %calc-time (foreign-lambda* double () "uint64_t time = mach_absolute_time();" "return( ((double) time) );")) (define %calc-factor (foreign-lambda* double () "mach_timebase_info_data_t info;" "mach_timebase_info( &info );" "return( ((double) info.numer) / ((double) info.denom) );")) (set! get-nanosecs (lambda () (* (%calc-time) %factor))) ;we immediatly determine the factor ;it should not change as long as the machine runs (set! %factor (%calc-factor)) (unless (positive? %factor) (error 'get-nanosecs "cannot determine scale factor" %factor) ) ) |#