/*
* (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 ()
{
* seconds to overflow 31 bits.
*/
+#ifndef _WIN32
StgByteArray
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 */
/*
* (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
*
- * $Id: getClockTime.c,v 1.3 1998/12/02 13:27:38 simonm Exp $
+ * $Id: getClockTime.c,v 1.4 1999/05/03 13:22:29 sof Exp $
*
* getClockTime Runtime Support
*/
# endif
#endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/timeb.h>
+#endif
+
StgInt
getClockTime(StgByteArray sec, StgByteArray nsec)
{
-#ifdef HAVE_GETCLOCK
+#if defined(_WIN32)
+ struct timeb t;
+
+ _ftime(&t);
+
+ ((unsigned int *)sec)[0] = (unsigned int)t.time;
+ ((unsigned int *)nsec)[0] = (unsigned int)t.millitm * 1000;
+ return 0;
+#elif defined(HAVE_GETCLOCK)
struct timespec tp;
if (getclock(TIMEOFDAY, &tp) != 0) {
((unsigned long int *)sec)[0] = tp.tv_sec;
((unsigned long int *)nsec)[0] = tp.tv_nsec;
return 0;
-#else
-#ifdef HAVE_GETTIMEOFDAY
+#elif defined(HAVE_GETTIMEOFDAY)
struct timeval tp;
if (gettimeofday(&tp, NULL) != 0) {
((unsigned long int *)nsec)[0] = 0;
return 0;
#endif
-#endif
}
StgInt
prim_getClockTime(StgByteArray sec, StgByteArray nsec)
{
-#ifdef HAVE_GETCLOCK
+#if defined(_WIN32)
+ struct timeb t;
+
+ _ftime(&t);
+
+ ((unsigned long int *)sec)[0] = t.time;
+ ((unsigned long int *)nsec)[0] = t.millitm * 1000;
+ return 0;
+#elif defined(HAVE_GETCLOCK)
struct timespec tp;
if (getclock(TIMEOFDAY, &tp) != 0) {
((StgInt64*)sec)[0] = tp.tv_sec;
((StgInt64*)nsec)[0] = tp.tv_nsec;
return 0;
-#else
-#ifdef HAVE_GETTIMEOFDAY
+#elif defined(HAVE_GETTIMEOFDAY)
struct timeval tp;
if (gettimeofday(&tp, NULL) != 0) {
((StgInt64*)nsec)[0] = 0;
return 0;
#endif
-#endif
}