X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fwin32.lisp;h=facc8c93ba82a9001e0b32c455b35a96b75c582c;hb=5d04a95274c9ddaebbcd6ddffc5d646e2c25598c;hp=5049c1e78cd8b32cba151199b37ae9bfceb9d217;hpb=a4a5e8fb87c7af981cb4c759dc3c5e6d44074f42;p=sbcl.git diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 5049c1e..facc8c9 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -191,7 +191,7 @@ ;;870 IBM EBCDIC - Multilingual/ROECE (Latin-2) (874 :CP874) ;; ANSI/OEM - Thai (same as 28605, ISO 8859-15) ;;875 IBM EBCDIC - Modern Greek - ;;932 ANSI/OEM - Japanese, Shift-JIS + (932 :CP932) ;; ANSI/OEM - Japanese, Shift-JIS ;;936 ANSI/OEM - Simplified Chinese (PRC, Singapore) ;;949 ANSI/OEM - Korean (Unified Hangul Code) ;;950 ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC) @@ -486,6 +486,9 @@ ;;;; Process time information +(defconstant 100ns-per-internal-time-unit + (/ 10000000 sb!xc:internal-time-units-per-second)) + ;; FILETIME ;; The FILETIME structure is a 64-bit value representing the number of ;; 100-nanosecond intervals since January 1, 1601 (UTC). @@ -493,22 +496,39 @@ ;; http://msdn.microsoft.com/library/en-us/sysinfo/base/filetime_str.asp? (define-alien-type FILETIME (sb!alien:unsigned 64)) -(defun get-process-times () - (with-alien ((creation-time filetime) - (exit-time filetime) - (kernel-time filetime) - (user-time filetime)) - (syscall* (("GetProcessTimes" 20) handle (* filetime) (* filetime) - (* filetime) (* filetime)) - (values creation-time - exit-time - kernel-time - user-time) - (get-current-process) - (addr creation-time) - (addr exit-time) - (addr kernel-time) - (addr user-time)))) +(defmacro with-process-times ((creation-time exit-time kernel-time user-time) + &body forms) + `(with-alien ((,creation-time filetime) + (,exit-time filetime) + (,kernel-time filetime) + (,user-time filetime)) + (syscall* (("GetProcessTimes" 20) handle (* filetime) (* filetime) + (* filetime) (* filetime)) + (progn ,@forms) + (get-current-process) + (addr ,creation-time) + (addr ,exit-time) + (addr ,kernel-time) + (addr ,user-time)))) + +(declaim (inline system-internal-real-time)) + +(let ((epoch 0)) + (declare (unsigned-byte epoch)) + ;; FIXME: For optimization ideas see the unix implementation. + (defun reinit-internal-real-time () + (setf epoch 0 + epoch (get-internal-real-time))) + (defun get-internal-real-time () + (- (with-alien ((system-time filetime)) + (syscall (("GetSystemTimeAsFileTime" 4) void (* filetime)) + (values (floor system-time 100ns-per-internal-time-unit)) + (addr system-time))) + epoch))) + +(defun system-internal-run-time () + (with-process-times (creation-time exit-time kernel-time user-time) + (values (floor (+ user-time kernel-time) 100ns-per-internal-time-unit)))) ;; SETENV ;; The SetEnvironmentVariable function sets the contents of the specified