diff options
Diffstat (limited to 'rts/win32/GetTime.c')
-rw-r--r-- | rts/win32/GetTime.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/rts/win32/GetTime.c b/rts/win32/GetTime.c new file mode 100644 index 0000000000..584b994d53 --- /dev/null +++ b/rts/win32/GetTime.c @@ -0,0 +1,101 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team 2005 + * + * Machine-dependent time measurement functions + * + * ---------------------------------------------------------------------------*/ + +#include "Rts.h" +#include "GetTime.h" + +#include <windows.h> + +#ifdef HAVE_TIME_H +# include <time.h> +#endif + +#define HNS_PER_SEC 10000000LL /* FILETIMES are in units of 100ns */ +/* Convert FILETIMEs into secs */ + +static INLINE_ME Ticks +fileTimeToTicks(FILETIME ft) +{ + Ticks t; + t = ((Ticks)ft.dwHighDateTime << 32) | ft.dwLowDateTime; + t = (t * TICKS_PER_SECOND) / HNS_PER_SEC; + return t; +} + +static int is_win9x = -1; + +static INLINE_ME rtsBool +isWin9x(void) +{ + if (is_win9x < 0) { + /* figure out whether we're on a Win9x box or not. */ + OSVERSIONINFO oi; + BOOL b; + + /* Need to init the size field first.*/ + oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + b = GetVersionEx(&oi); + + is_win9x = ( (b && (oi.dwPlatformId & VER_PLATFORM_WIN32_WINDOWS)) ? 1 : 0); + } + return is_win9x; +} + + +void +getProcessTimes(Ticks *user, Ticks *elapsed) +{ + *user = getProcessCPUTime(); + *elapsed = getProcessElapsedTime(); +} + +Ticks +getProcessCPUTime(void) +{ + FILETIME creationTime, exitTime, userTime, kernelTime = {0,0}; + + if (isWin9x()) return getProcessElapsedTime(); + + if (!GetProcessTimes(GetCurrentProcess(), &creationTime, + &exitTime, &kernelTime, &userTime)) { + return 0; + } + + return fileTimeToTicks(userTime); +} + +Ticks +getProcessElapsedTime(void) +{ + FILETIME system_time; + GetSystemTimeAsFileTime(&system_time); + return fileTimeToTicks(system_time); +} + +Ticks +getThreadCPUTime(void) +{ + FILETIME creationTime, exitTime, userTime, kernelTime = {0,0}; + + if (isWin9x()) return getProcessCPUTime(); + + if (!GetThreadTimes(GetCurrentThread(), &creationTime, + &exitTime, &kernelTime, &userTime)) { + return 0; + } + + return fileTimeToTicks(userTime); +} + +nat +getPageFaults(void) +{ + /* ToDo (on NT): better, get this via the performance data + that's stored in the registry. */ + return 0; +} |