chibi-scheme/lib/scheme/time.sld
2015-01-26 08:06:59 +09:00

78 lines
3.2 KiB
Scheme

;; time.sld - (scheme time) library definition
;;
;; Copyright (c) 2012 Alex Shinn. All rights reserved.
;; Copyright (c) 2012 Alan Watson. All rights reserved.
;; BSD-style license: http://synthcode.com/license.txt
(define-library (scheme time)
(export current-second current-jiffy jiffies-per-second)
(import (chibi))
(import (scheme process-context))
(import (scheme time tai))
(include-shared "time")
;; If the environment variable SEXP_CLOCK_TYPE is set, its value
;; is used for the system clock type. If the environment variable
;; SEXP_CLOCK_TYPE is not set, then the system clock is ntp-like
;; if current-ntp-clock-values is a procedure and is posix-like
;; otherwise.
(cond-expand
(ntp
(begin
(define clock-type
(cond
((get-environment-variable "SEXP_CLOCK_TYPE")
=> (lambda (x)
(let ((type (string->symbol x)))
(case type
((posix-like tai-like ntp-like) type)
(else
(display "invalid value for SEXP_CLOCK_TYPE: " (current-error-port))
(write x (current-error-port))
(display " - expected \"ntp-like\", \"posix-like\" or \"tai-like\"\n" (current-error-port))
'ntp-like)))))
(else 'ntp-like)))))
(else
(begin (define clock-type 'posix-like))))
(begin
;; The value of the environment variable SEXP_CLOCK_EPOCH_OFFSET
;; specifies the offset of the system clock relative to the
;; standard epoch (1970-01-01 00:00:00 UTC for posix-like and
;; ntp-like clocks and 1970-01-01 00:00:00 TAI for tai-like system
;; clocks). If it not set, the offset is assumed to be zero. In
;; call-with-current-clock-values, the offset is added to the
;; current seconds before calling the procedure argument.
(define epoch-offset
(exact->inexact
(string->number
(or (get-environment-variable "SEXP_CLOCK_EPOCH_OFFSET")
"0"))))
;; Normally, one does not need to specify either the clock type or
;; clock epoch explicitly. One case where it might be necessary is
;; if the system clock runs on the TAI-10 timescale. In this case,
;; one should set SEXP_CLOCK_TYPE to "tai-like" and
;; SEXP_CLOCK_EPOCH_OFFSET to -10.
;;
;; The call-with-current-clock-values obtains the clock values
;; from the current-ntp-clock-values procedure, if the system
;; clock is ntp-like, and from the current-clock-second procedure
;; otherwise.
(define call-with-current-clock-values
(cond-expand
(ntp
(case clock-type
((ntp-like)
(lambda (p)
(let ((values-pair (current-ntp-clock-values)))
(p (+ (car values-pair) epoch-offset) (cdr values-pair)))))
(else
(lambda (p) (p (+ (current-clock-second) epoch-offset) #f)))))
(else
(lambda (p) (p (+ (current-clock-second) epoch-offset) #f)))))
;; Exported interface.
(define current-second
(make-tai-clock clock-type call-with-current-clock-values))
(define (current-jiffy)
(inexact->exact (round (* (current-second) (jiffies-per-second)))))
(define (jiffies-per-second) 1000)))