From ed198935bdd0ef50c105373958e8c1f2b26eb10b Mon Sep 17 00:00:00 2001 From: sof Date: Mon, 3 May 1999 13:22:29 +0000 Subject: [PATCH] [project @ 1999-05-03 13:22:29 by sof] Win32'ified --- ghc/lib/std/cbits/getCPUTime.c | 52 +++++++++++++++++++++++++++++++++++++- ghc/lib/std/cbits/getClockTime.c | 36 +++++++++++++++++++------- 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/ghc/lib/std/cbits/getCPUTime.c b/ghc/lib/std/cbits/getCPUTime.c index 2d4e008..8e34841 100644 --- a/ghc/lib/std/cbits/getCPUTime.c +++ b/ghc/lib/std/cbits/getCPUTime.c @@ -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 */ @@ -51,6 +51,10 @@ #define HAVE_GETRUSAGE #endif +#ifdef HAVE_WINDOWS_H +# include +#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 */ diff --git a/ghc/lib/std/cbits/getClockTime.c b/ghc/lib/std/cbits/getClockTime.c index 07e032b..9b96e33 100644 --- a/ghc/lib/std/cbits/getClockTime.c +++ b/ghc/lib/std/cbits/getClockTime.c @@ -1,7 +1,7 @@ /* * (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 */ @@ -36,10 +36,24 @@ # endif #endif +#ifdef HAVE_WINDOWS_H +#include +#include +#include +#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) { @@ -50,8 +64,7 @@ getClockTime(StgByteArray sec, StgByteArray nsec) ((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) { @@ -73,13 +86,20 @@ getClockTime(StgByteArray sec, StgByteArray nsec) ((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) { @@ -90,8 +110,7 @@ prim_getClockTime(StgByteArray sec, StgByteArray nsec) ((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) { @@ -113,5 +132,4 @@ prim_getClockTime(StgByteArray sec, StgByteArray nsec) ((StgInt64*)nsec)[0] = 0; return 0; #endif -#endif } -- 1.7.10.4