/*
* (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
*
- * $Id: getCPUTime.c,v 1.3 1998/12/02 13:27:36 simonm Exp $
+ * $Id: getCPUTime.c,v 1.7 2000/04/06 17:54:01 rrt Exp $
*
* getCPUTime Runtime Support
*/
#include <unistd.h>
#endif
-#ifdef HAVE_SYS_TIMES_H
-#include <sys/times.h>
+#ifndef mingw32_TARGET_OS
+# ifdef HAVE_SYS_TIMES_H
+# include <sys/times.h>
+# endif
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
-#if defined(HAVE_SYS_RESOURCE_H) && ! irix_TARGET_OS
-#include <sys/resource.h>
+#if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS)
+# if defined(HAVE_SYS_RESOURCE_H)
+# include <sys/resource.h>
+# endif
#endif
#ifdef HAVE_SYS_TIMEB_H
#define HAVE_GETRUSAGE
#endif
+#ifdef HAVE_WINDOWS_H
+# include <windows.h>
+#endif
+
StgInt
clockTicks ()
{
* seconds to overflow 31 bits.
*/
-StgByteArray
+#ifndef _WIN32
+StgInt
getCPUTime(StgByteArray cpuStruct)
{
StgInt *cpu=(StgInt *)cpuStruct;
cpu[3] = (t.tms_stime - cpu[2] * ticks) * (1000000000 / ticks);
# else
- return NULL;
+ return 0;
# endif
#endif
- return (StgByteArray) cpuStruct;
+ return 1;
}
+
+#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 */
+StgInt
+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 1;
+ }
+
+ FT2usecs(uT, userTime);
+ FT2usecs(kT, kernelTime);
+
+ cpu[0] = (unsigned int)(uT / NS_PER_SEC);
+ cpu[1] = (unsigned int)((uT - cpu[0] * NS_PER_SEC) * 100);
+ cpu[2] = (unsigned int)(kT / NS_PER_SEC);
+ cpu[3] = (unsigned int)((kT - cpu[2] * NS_PER_SEC) * 100);
+ return 1;
+}
+
+#endif /* _WIN32 */