From 123a920f598ddf1bbf07faace11cf9b9fadaa151 Mon Sep 17 00:00:00 2001 From: Chris Peterson Date: Sat, 18 Feb 2012 01:21:26 -0800 Subject: std: Fix Windows system time conversion for get_time() --- src/rt/rust_builtin.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'src/rt/rust_builtin.cpp') diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index ecc73204f29..d17741ac56b 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -393,18 +393,21 @@ rust_ptr_eq(type_desc *t, rust_box *a, rust_box *b) { #if defined(__WIN32__) extern "C" CDECL void get_time(uint32_t *sec, uint32_t *usec) { - rust_task *task = rust_task_thread::get_task(); - SYSTEMTIME systemTime; FILETIME fileTime; - GetSystemTime(&systemTime); - if (!SystemTimeToFileTime(&systemTime, &fileTime)) { - task->fail(); - return; - } - - // FIXME: This is probably completely wrong. - *sec = fileTime.dwHighDateTime; - *usec = fileTime.dwLowDateTime; + GetSystemTimeAsFileTime(&fileTime); + + // A FILETIME contains a 64-bit value representing the number of + // hectonanosecond (100-nanosecond) intervals since 1601-01-01T00:00:00Z. + // http://support.microsoft.com/kb/167296/en-us + ULARGE_INTEGER ul; + ul.LowPart = fileTime.dwLowDateTime; + ul.HighPart = fileTime.dwHighDateTime; + uint64_t ns_since_1601 = ul.QuadPart / 10; + + const uint64_t NANOSECONDS_FROM_1601_TO_1970 = 11644473600000000u; + uint64_t ns_since_1970 = ns_since_1601 - NANOSECONDS_FROM_1601_TO_1970; + *sec = ns_since_1970 / 1000000; + *usec = ns_since_1970 % 1000000; } #else extern "C" CDECL void -- cgit 1.4.1-3-g733a5