(struct timezone
(tz-minuteswest int) ; minutes west of Greenwich
(tz-dsttime int))) ; type of dst correction
-
-;;; If it works, UNIX-GETTIMEOFDAY returns 5 values: T, the seconds
-;;; and microseconds of the current time of day, the timezone (in
-;;; minutes west of Greenwich), and a daylight-savings flag. If it
-;;; doesn't work, it returns NIL and the errno.
-#!-sb-fluid (declaim (inline unix-gettimeofday))
-(defun unix-gettimeofday ()
- #!+(and x86-64 darwin)
- (with-alien ((tv (struct timeval)))
- ;; CLH: FIXME! This seems to be a MacOS bug, but on x86-64/darwin,
- ;; gettimeofday occasionally fails. passing in a null pointer for
- ;; the timezone struct seems to work around the problem. I can't
- ;; find any instances in the SBCL where we actually ues the
- ;; timezone values, so we just punt for the moment.
- (syscall* ("gettimeofday" (* (struct timeval))
- (* (struct timezone)))
- (values t
- (slot tv 'tv-sec)
- (slot tv 'tv-usec))
- (addr tv)
- nil))
- #!-(and x86-64 darwin)
- (with-alien ((tv (struct timeval))
- (tz (struct timezone)))
- (syscall* ("gettimeofday" (* (struct timeval))
- (* (struct timezone)))
- (values t
- (slot tv 'tv-sec)
- (slot tv 'tv-usec)
- (slot tz 'tz-minuteswest)
- (slot tz 'tz-dsttime))
- (addr tv)
- (addr tz))))
\f
;; Type of the second argument to `getitimer' and
;;; Windows build.
#!-win32
(progn
+
+ #!-sb-fluid (declaim (inline get-time-of-day))
+ (defun get-time-of-day ()
+ "Return the number of seconds and microseconds since the beginning og
+the UNIX epoch (January 1st 1970.)"
+ #!+darwin
+ (with-alien ((tv (struct timeval)))
+ ;; CLH: FIXME! This seems to be a MacOS bug, but on x86-64/darwin,
+ ;; gettimeofday occasionally fails. passing in a null pointer for the
+ ;; timezone struct seems to work around the problem. NS notes: Darwin
+ ;; manpage says the timezone is not used anymore in their implementation
+ ;; at all.
+ (syscall* ("gettimeofday" (* (struct timeval))
+ (* (struct timezone)))
+ (values (slot tv 'tv-sec)
+ (slot tv 'tv-usec))
+ (addr tv)
+ nil))
+ #!-(and x86-64 darwin)
+ (with-alien ((tv (struct timeval))
+ (tz (struct timezone)))
+ (syscall* ("gettimeofday" (* (struct timeval))
+ (* (struct timezone)))
+ (values (slot tv 'tv-sec)
+ (slot tv 'tv-usec))
+ (addr tv)
+ (addr tz))))
+
(declaim (inline system-internal-run-time
system-real-time-values))
(defun system-real-time-values ()
- (multiple-value-bind (_ sec usec) (unix-gettimeofday)
- (declare (ignore _) (type (unsigned-byte 32) sec usec))
+ (multiple-value-bind (sec usec) (get-time-of-day)
+ (declare (type (unsigned-byte 32) sec usec))
(values sec (truncate usec micro-seconds-per-internal-time-unit))))
;; There are two optimizations here that actually matter (on 32-bit
micro-seconds-per-internal-time-unit))))
result))))
\f
+;;; FIXME, KLUDGE: GET-TIME-OF-DAY used to be UNIX-GETTIMEOFDAY, and had a
+;;; primary return value indicating sucess, and also returned timezone
+;;; information -- though the timezone data was not there on Darwin.
+;;; Now we have GET-TIME-OF-DAY, but it turns out that despite SB-UNIX being
+;;; an implementation package UNIX-GETTIMEOFDAY has users in the wild.
+;;; So we're stuck with it for a while -- maybe delete it towards the end
+;;; of 2009.
+(defun unix-gettimeofday ()
+ (multiple-value-bind (sec usec) (get-time-of-day)
+ (values t sec usec nil nil)))
+\f
;;;; opendir, readdir, closedir, and dirent-name
(declaim (inline unix-opendir))
(with-process-times (creation-time exit-time kernel-time user-time)
(values (floor (+ user-time kernel-time) 100ns-per-internal-time-unit))))
+(define-alien-type hword (unsigned 16))
+
+(define-alien-type systemtime
+ (struct systemtime
+ (year hword)
+ (month hword)
+ (weekday hword)
+ (day hword)
+ (hour hword)
+ (minute hword)
+ (second hword)
+ (millisecond hword)))
+
+;; Obtained with, but the XC can't deal with that -- but
+;; it's not like the value is ever going to change...
+;; (with-alien ((filetime filetime)
+;; (epoch systemtime))
+;; (setf (slot epoch 'year) 1970
+;; (slot epoch 'month) 1
+;; (slot epoch 'day) 1
+;; (slot epoch 'hour) 0
+;; (slot epoch 'minute) 0
+;; (slot epoch 'second) 0
+;; (slot epoch 'millisecond) 0)
+;; (syscall (("SystemTimeToFileTime" 8) void
+;; (* systemtime) (* filetime))
+;; filetime
+;; (addr epoch)
+;; (addr filetime)))
+(defconstant +unix-epoch-filetime+ 116444736000000000)
+
+#!-sb-fluid
+(declaim (inline get-time-of-day))
+(defun get-time-of-day ()
+ "Return the number of seconds and microseconds since the beginning og the
+UNIX epoch: January 1st 1970."
+ (with-alien ((system-time filetime))
+ (syscall (("GetSystemTimeAsFileTime" 4) void (* filetime))
+ (multiple-value-bind (sec 100ns)
+ (floor (- system-time +unix-epoch-filetime+)
+ (* 100ns-per-internal-time-unit
+ internal-time-units-per-second))
+ (values sec (floor 100ns 10)))
+ (addr system-time))))
+
;; SETENV
;; The SetEnvironmentVariable function sets the contents of the specified
;; environment variable for the current process.