[project @ 1999-05-03 13:22:29 by sof]
[ghc-hetmet.git] / ghc / lib / std / cbits / getCPUTime.c
index 2d4e008..8e34841 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
  *
- * $Id: getCPUTime.c,v 1.4 1999/03/01 09:04:07 sof Exp $
+ * $Id: getCPUTime.c,v 1.5 1999/05/03 13:22:29 sof Exp $
  *
  * getCPUTime Runtime Support
  */
 #define HAVE_GETRUSAGE
 #endif
 
+#ifdef HAVE_WINDOWS_H
+# include <windows.h>
+#endif
+
 StgInt 
 clockTicks ()
 {
@@ -71,6 +75,7 @@ clockTicks ()
  * seconds to overflow 31 bits.
  */
 
+#ifndef _WIN32
 StgByteArray
 getCPUTime(StgByteArray cpuStruct)
 {
@@ -114,3 +119,48 @@ getCPUTime(StgByteArray cpuStruct)
 #endif
     return (StgByteArray) cpuStruct;
 }
+
+#else
+
+#ifdef _WIN32
+/* 100ns units per sec, really */
+#define NS_PER_SEC 10000000LL
+#define FT2usecs(ll,ft)    \
+    (ll)=(ft).dwHighDateTime; \
+    (ll) <<= 32;              \
+    (ll) |= (ft).dwLowDateTime;
+
+#endif
+
+/* cygwin32 or mingw32 version */
+StgByteArray
+getCPUTime(StgByteArray cpuStruct)
+{
+    FILETIME creationTime, exitTime, kernelTime, userTime;
+    StgInt *cpu=(StgInt *)cpuStruct;
+    unsigned long long uT, kT;
+    /* ToDo: pin down elapsed times to just the OS thread(s) that
+       are evaluating/managing Haskell code.
+    */
+    if (!GetProcessTimes (GetCurrentProcess(), &creationTime,
+                         &exitTime, &kernelTime, &userTime)) {
+       /* Probably on a Win95 box..*/
+        cpu[0]=0;
+        cpu[1]=0;
+        cpu[2]=0;
+        cpu[3]=0;
+       return (StgByteArray)cpu;
+    }
+
+    FT2usecs(uT, userTime);
+    FT2usecs(kT, kernelTime);
+    
+    cpu[0] = (unsigned int)(uT / NS_PER_SEC);
+    cpu[1] = (unsigned int)(uT * 100);
+    cpu[0] = (unsigned int)(kT / NS_PER_SEC);
+    cpu[1] = (unsigned int)(kT * 100);
+    return (StgByteArray)cpu;
+}
+
+#endif /* _WIN32 */