summaryrefslogtreecommitdiff
path: root/rts/win32/GetTime.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/win32/GetTime.c')
-rw-r--r--rts/win32/GetTime.c101
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;
+}