1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
6 (in-package :iolib
/base
)
11 (deftype timeout-designator
()
12 '(or non-negative-real
(member t nil
)))
14 (deftype positive-timeout-designator
()
15 '(or non-negative-real
(eql t
)))
17 ;;; Break a real timeout into seconds and microseconds.
18 (defun decode-timeout (timeout)
19 (assert (or (not timeout
)
20 (and (typep timeout
'real
)
21 (not (minusp timeout
))))
23 "The timeout must be a non-negative real or NIL: ~S" timeout
)
26 (integer (values timeout
0))
28 (multiple-value-bind (q r
) (truncate (coerce timeout
'timeout
))
29 (declare (type unsigned-byte q
)
31 (values q
(the (values unsigned-byte t
) (truncate (* r
1d6
))))))))
33 (defun normalize-timeout (timeout)
34 (assert (and (typep timeout
'real
)
35 (not (minusp timeout
)))
37 "The timeout must be non-negative: ~A" timeout
)
38 (coerce timeout
'timeout
))
40 (defun clamp-timeout (timeout &optional
(min 0) (max most-positive-fixnum
))
41 (clamp (or timeout most-positive-fixnum
)
42 (if min
(max min
0) 0) (or max most-positive-fixnum
)))