X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fwin32.lisp;h=fb3d5c120f82a65ee22642fdded497b52a65b520;hb=9a82b26397de09d67372f34158090c2284fd1411;hp=facc8c93ba82a9001e0b32c455b35a96b75c582c;hpb=d25e3478acccec70402ff32554669a982be8e281;p=sbcl.git diff --git a/src/code/win32.lisp b/src/code/win32.lisp index facc8c9..fb3d5c1 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -530,6 +530,51 @@ (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.