1.0.4.39: get rid of hardcoded mutex and spinlock slot indexes
[sbcl.git] / src / code / win32.lisp
index 5049c1e..facc8c9 100644 (file)
           ;;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)
 
 ;;;; 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).
 ;; 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