[project @ 2004-05-06 08:44:52 by simonmar]
[ghc-base.git] / System / CPUTime.hsc
index b9678a3..6624870 100644 (file)
@@ -2,7 +2,7 @@
 -- |
 -- Module      :  System.CPUTime
 -- Copyright   :  (c) The University of Glasgow 2001
--- License     :  BSD-style (see the file libraries/core/LICENSE)
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
 -- 
 -- Maintainer  :  libraries@haskell.org
 -- Stability   :  provisional
@@ -26,6 +26,10 @@ import Data.Ratio
 import Hugs.Time ( getCPUTime, clockTicks )
 #endif
 
+#ifdef __NHC__
+import CPUTime ( getCPUTime, cpuTimePrecision )
+#endif
+
 #ifdef __GLASGOW_HASKELL__
 import Foreign
 import Foreign.C
@@ -87,6 +91,8 @@ foreign import ccall unsafe times :: Ptr CTms -> IO CClock
 #endif
 
 #else /* win32 */
+     -- NOTE: GetProcessTimes() is only supported on NT-based OSes.
+     -- The counts reported by GetProcessTimes() are in 100-ns (10^-7) units.
     allocaBytes (#const sizeof(FILETIME)) $ \ p_creationTime -> do
     allocaBytes (#const sizeof(FILETIME)) $ \ p_exitTime -> do
     allocaBytes (#const sizeof(FILETIME)) $ \ p_kernelTime -> do
@@ -96,11 +102,15 @@ foreign import ccall unsafe times :: Ptr CTms -> IO CClock
     if toBool ok then do
       ut <- ft2psecs p_userTime
       kt <- ft2psecs p_kernelTime
-      return (fromIntegral (ut + kt))
+      return (ut + kt)
      else return 0
-  where ft2psecs ft = do
+  where 
+       ft2psecs :: Ptr FILETIME -> IO Integer
+        ft2psecs ft = do
           high <- (#peek FILETIME,dwHighDateTime) ft :: IO CLong
           low <- (#peek FILETIME,dwLowDateTime) ft :: IO CLong
+           -- Convert 100-ns units to picosecs (10^-12) 
+           -- => multiply by 10^5.
           return (((fromIntegral high) * (2^32) + (fromIntegral low)) * 100000)
 
     -- ToDo: pin down elapsed times to just the OS thread(s) that
@@ -119,8 +129,10 @@ foreign import ccall unsafe "GetProcessTimes" getProcessTimes :: Ptr HANDLE -> P
 -- in CPU time that the implementation can record, and is given as an
 -- integral number of picoseconds.
 
+#ifndef __NHC__
 cpuTimePrecision :: Integer
 cpuTimePrecision = round ((1000000000000::Integer) % fromIntegral (clockTicks))
+#endif
 
 #ifdef __GLASGOW_HASKELL__
 clockTicks :: Int