Merge pull request #3114 from alexanderkyte/mono_conf_gc
[mono.git] / mono / utils / mono-time.c
index 5d926a930bb2fb8d454cefcdb930ba7c83462f7f..5cc82fccb55e082f6ecd6b198f1321eed06eda95 100644 (file)
@@ -2,22 +2,41 @@
  * Time utility functions.
  * Author: Paolo Molaro (<lupus@ximian.com>)
  * Copyright (C) 2008 Novell, Inc.
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
-#include <utils/mono-time.h>
+#include <config.h>
 #include <stdlib.h>
 #include <stdio.h>
 
-#define MTICKS_PER_SEC 10000000
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#include <utils/mono-time.h>
+
+
+#define MTICKS_PER_SEC (10 * 1000 * 1000)
+
+gint64
+mono_msec_ticks (void)
+{
+       return mono_100ns_ticks () / 10 / 1000;
+}
 
 #ifdef HOST_WIN32
 #include <windows.h>
 
-guint32
-mono_msec_ticks (void)
+#ifndef _MSC_VER
+/* we get "error: implicit declaration of function 'GetTickCount64'" */
+WINBASEAPI ULONGLONG WINAPI GetTickCount64(void);
+#endif
+
+gint64
+mono_msec_boottime (void)
 {
        /* GetTickCount () is reportedly monotonic */
-       return GetTickCount ();
+       return GetTickCount64 ();
 }
 
 /* Returns the number of 100ns ticks from unspecified time: this should be monotonic */
@@ -38,15 +57,10 @@ mono_100ns_ticks (void)
        QueryPerformanceCounter (&value);
        cur_time = value.QuadPart;
        /* we use unsigned numbers and return the difference to avoid overflows */
-       return (cur_time - start_time) * MTICKS_PER_SEC / freq.QuadPart;
+       return (cur_time - start_time) * (double)MTICKS_PER_SEC / freq.QuadPart;
 }
 
-/*
- * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001
- */
-#define FILETIME_ADJUST ((guint64)504911232000000000LL)
-
-/* Returns the number of 100ns ticks since 1/1/1, UTC timezone */
+/* Returns the number of 100ns ticks since Jan 1, 1601, UTC timezone */
 gint64
 mono_100ns_datetime (void)
 {
@@ -56,17 +70,16 @@ mono_100ns_datetime (void)
                g_assert_not_reached ();
 
        GetSystemTimeAsFileTime ((FILETIME*) &ft);
-       return FILETIME_ADJUST + ft.QuadPart;
+       return ft.QuadPart;
 }
 
 #else
 
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
 
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined (HAVE_SYS_PARAM_H)
 #include <sys/param.h>
+#endif
+#if defined(HAVE_SYS_SYSCTL_H)
 #include <sys/sysctl.h>
 #endif
 
@@ -80,7 +93,7 @@ mono_100ns_datetime (void)
 static gint64
 get_boot_time (void)
 {
-#if defined(PLATFORM_MACOSX) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined (HAVE_SYS_PARAM_H) && defined (KERN_BOOTTIME)
        int mib [2];
        size_t size;
        time_t now;
@@ -100,7 +113,7 @@ get_boot_time (void)
        if (uptime) {
                double upt;
                if (fscanf (uptime, "%lf", &upt) == 1) {
-                       gint64 now = mono_100ns_ticks ();
+                       gint64 now = mono_100ns_datetime ();
                        fclose (uptime);
                        return now - (gint64)(upt * MTICKS_PER_SEC);
                }
@@ -112,14 +125,14 @@ get_boot_time (void)
 }
 
 /* Returns the number of milliseconds from boot time: this should be monotonic */
-guint32
-mono_msec_ticks (void)
+gint64
+mono_msec_boottime (void)
 {
        static gint64 boot_time = 0;
        gint64 now;
        if (!boot_time)
                boot_time = get_boot_time ();
-       now = mono_100ns_ticks ();
+       now = mono_100ns_datetime ();
        /*printf ("now: %llu (boot: %llu) ticks: %llu\n", (gint64)now, (gint64)boot_time, (gint64)(now - boot_time));*/
        return (now - boot_time)/10000;
 }
@@ -160,20 +173,26 @@ mono_100ns_ticks (void)
 }
 
 /*
- * Magic number to convert a time which is relative to
- * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
+ * Magic number to convert unix epoch start to windows epoch start
+ * Jan 1, 1970 into a value which is relative to Jan 1, 1601.
  */
-#define EPOCH_ADJUST    ((guint64)62135596800LL)
+#define EPOCH_ADJUST    ((guint64)11644473600LL)
 
-/* Returns the number of 100ns ticks since 1/1/1, UTC timezone */
+/* Returns the number of 100ns ticks since 1/1/1601, UTC timezone */
 gint64
 mono_100ns_datetime (void)
 {
        struct timeval tv;
        if (gettimeofday (&tv, NULL) == 0)
-               return (((gint64)tv.tv_sec + EPOCH_ADJUST) * 1000000 + tv.tv_usec) * 10;
+               return mono_100ns_datetime_from_timeval (tv);
        return 0;
 }
 
+gint64
+mono_100ns_datetime_from_timeval (struct timeval tv)
+{
+       return (((gint64)tv.tv_sec + EPOCH_ADJUST) * 1000000 + tv.tv_usec) * 10;
+}
+
 #endif