Skip to content

Commit 123a920

Browse files
committed
std: Fix Windows system time conversion for get_time()
1 parent ef6f628 commit 123a920

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/rt/rust_builtin.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -393,18 +393,21 @@ rust_ptr_eq(type_desc *t, rust_box *a, rust_box *b) {
393393
#if defined(__WIN32__)
394394
extern "C" CDECL void
395395
get_time(uint32_t *sec, uint32_t *usec) {
396-
rust_task *task = rust_task_thread::get_task();
397-
SYSTEMTIME systemTime;
398396
FILETIME fileTime;
399-
GetSystemTime(&systemTime);
400-
if (!SystemTimeToFileTime(&systemTime, &fileTime)) {
401-
task->fail();
402-
return;
403-
}
404-
405-
// FIXME: This is probably completely wrong.
406-
*sec = fileTime.dwHighDateTime;
407-
*usec = fileTime.dwLowDateTime;
397+
GetSystemTimeAsFileTime(&fileTime);
398+
399+
// A FILETIME contains a 64-bit value representing the number of
400+
// hectonanosecond (100-nanosecond) intervals since 1601-01-01T00:00:00Z.
401+
// http://support.microsoft.com/kb/167296/en-us
402+
ULARGE_INTEGER ul;
403+
ul.LowPart = fileTime.dwLowDateTime;
404+
ul.HighPart = fileTime.dwHighDateTime;
405+
uint64_t ns_since_1601 = ul.QuadPart / 10;
406+
407+
const uint64_t NANOSECONDS_FROM_1601_TO_1970 = 11644473600000000u;
408+
uint64_t ns_since_1970 = ns_since_1601 - NANOSECONDS_FROM_1601_TO_1970;
409+
*sec = ns_since_1970 / 1000000;
410+
*usec = ns_since_1970 % 1000000;
408411
}
409412
#else
410413
extern "C" CDECL void

0 commit comments

Comments
 (0)