projects
/
haskell-directory.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[project @ 2004-01-14 11:16:10 by malcolm]
[haskell-directory.git]
/
System
/
CPUTime.hsc
diff --git
a/System/CPUTime.hsc
b/System/CPUTime.hsc
index
e5a8a45
..
0ce703e
100644
(file)
--- a/
System/CPUTime.hsc
+++ b/
System/CPUTime.hsc
@@
-20,22
+20,25
@@
module System.CPUTime
import Prelude
import Prelude
+import Data.Ratio
+
+#ifdef __HUGS__
+import Hugs.Time ( getCPUTime, clockTicks )
+#endif
+
+#ifdef __GLASGOW_HASKELL__
import Foreign
import Foreign.C
import Foreign
import Foreign.C
-import Data.Ratio
-
#include "HsBase.h"
#include "HsBase.h"
+#endif
+#ifdef __GLASGOW_HASKELL__
-- -----------------------------------------------------------------------------
-- -----------------------------------------------------------------------------
--- Computation `getCPUTime' returns the number of picoseconds CPU time
+-- |Computation 'getCPUTime' returns the number of picoseconds CPU time
-- used by the current program. The precision of this result is
-- implementation-dependent.
-- used by the current program. The precision of this result is
-- implementation-dependent.
--- The `cpuTimePrecision' constant is the smallest measurable difference
--- in CPU time that the implementation can record, and is given as an
--- integral number of picoseconds.
-
getCPUTime :: IO Integer
getCPUTime = do
getCPUTime :: IO Integer
getCPUTime = do
@@
-84,6
+87,8
@@
foreign import ccall unsafe times :: Ptr CTms -> IO CClock
#endif
#else /* win32 */
#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
allocaBytes (#const sizeof(FILETIME)) $ \ p_creationTime -> do
allocaBytes (#const sizeof(FILETIME)) $ \ p_exitTime -> do
allocaBytes (#const sizeof(FILETIME)) $ \ p_kernelTime -> do
@@
-93,11
+98,15
@@
foreign import ccall unsafe times :: Ptr CTms -> IO CClock
if toBool ok then do
ut <- ft2psecs p_userTime
kt <- ft2psecs p_kernelTime
if toBool ok then do
ut <- ft2psecs p_userTime
kt <- ft2psecs p_kernelTime
- return (fromIntegral (ut + kt))
+ return (ut + kt)
else return 0
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
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
return (((fromIntegral high) * (2^32) + (fromIntegral low)) * 100000)
-- ToDo: pin down elapsed times to just the OS thread(s) that
@@
-110,10
+119,16
@@
foreign import ccall unsafe "GetCurrentProcess" getCurrentProcess :: IO (Ptr HAN
foreign import ccall unsafe "GetProcessTimes" getProcessTimes :: Ptr HANDLE -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> IO CInt
#endif /* not _WIN32 */
foreign import ccall unsafe "GetProcessTimes" getProcessTimes :: Ptr HANDLE -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> IO CInt
#endif /* not _WIN32 */
+#endif /* __GLASGOW_HASKELL__ */
+
+-- |The 'cpuTimePrecision' constant is the smallest measurable difference
+-- in CPU time that the implementation can record, and is given as an
+-- integral number of picoseconds.
cpuTimePrecision :: Integer
cpuTimePrecision = round ((1000000000000::Integer) % fromIntegral (clockTicks))
cpuTimePrecision :: Integer
cpuTimePrecision = round ((1000000000000::Integer) % fromIntegral (clockTicks))
+#ifdef __GLASGOW_HASKELL__
clockTicks :: Int
clockTicks =
#if defined(CLK_TCK)
clockTicks :: Int
clockTicks =
#if defined(CLK_TCK)
@@
-122,3
+137,4
@@
clockTicks =
unsafePerformIO (sysconf (#const _SC_CLK_TCK) >>= return . fromIntegral)
foreign import ccall unsafe sysconf :: CInt -> IO CLong
#endif
unsafePerformIO (sysconf (#const _SC_CLK_TCK) >>= return . fromIntegral)
foreign import ccall unsafe sysconf :: CInt -> IO CLong
#endif
+#endif /* __GLASGOW_HASKELL__ */