From 583314184abc30bd5f563d96fe3906e8b84fdaa2 Mon Sep 17 00:00:00 2001 From: Scott Graham Date: Fri, 20 Feb 2015 11:35:04 -0800 Subject: [PATCH] win: add equivalent of gettimeofday R=mark@chromium.org BUG=crashpad:1 Review URL: https://codereview.chromium.org/940793002 --- util/util.gyp | 3 +++ util/win/time.cc | 42 ++++++++++++++++++++++++++++++++++++++++++ util/win/time.h | 27 +++++++++++++++++++++++++++ util/win/time_test.cc | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 util/win/time.cc create mode 100644 util/win/time.h create mode 100644 util/win/time_test.cc diff --git a/util/util.gyp b/util/util.gyp index ddb4695d..083a92d7 100644 --- a/util/util.gyp +++ b/util/util.gyp @@ -131,6 +131,8 @@ 'synchronization/semaphore.h', 'win/scoped_handle.cc', 'win/scoped_handle.h', + 'win/time.cc', + 'win/time.h', ], 'conditions': [ ['OS=="mac"', { @@ -306,6 +308,7 @@ 'test/multiprocess_exec_test.cc', 'test/multiprocess_posix_test.cc', 'test/scoped_temp_dir_test.cc', + 'win/time_test.cc', ], 'conditions': [ ['OS=="mac"', { diff --git a/util/win/time.cc b/util/win/time.cc new file mode 100644 index 00000000..1957b6c9 --- /dev/null +++ b/util/win/time.cc @@ -0,0 +1,42 @@ +// Copyright 2015 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/win/time.h" + +#include +#include + +#include "base/logging.h" + +namespace crashpad { + +void GetTimeOfDay(timeval* tv) { + FILETIME filetime; + GetSystemTimeAsFileTime(&filetime); + uint64_t t = (static_cast(filetime.dwHighDateTime) << 32) | + filetime.dwLowDateTime; + t /= 10; // 100 nanosecond intervals to microseconds. + // Windows epoch is 1601-01-01, and FILETIME ticks are 100 nanoseconds. + // 1601 to 1970 is 369 years + 89 leap days = 134774 days * 86400 seconds per + // day. It's not entirely clear, but it appears that these are solar seconds, + // not SI seconds, so there are no leap seconds to be considered. + const uint64_t kNumSecondsFrom1601To1970 = (369 * 365 + 89) * 86400ULL; + const uint64_t kMicrosecondsPerSecond = static_cast(1E6); + DCHECK_GE(t, kNumSecondsFrom1601To1970 * kMicrosecondsPerSecond); + t -= kNumSecondsFrom1601To1970 * kMicrosecondsPerSecond; + tv->tv_sec = static_cast(t / kMicrosecondsPerSecond); + tv->tv_usec = static_cast(t % kMicrosecondsPerSecond); +} + +} // namespace crashpad diff --git a/util/win/time.h b/util/win/time.h new file mode 100644 index 00000000..e61a8461 --- /dev/null +++ b/util/win/time.h @@ -0,0 +1,27 @@ +// Copyright 2015 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_WIN_TIME_H_ +#define CRASHPAD_UTIL_WIN_TIME_H_ + +#include + +namespace crashpad { + +//! \brief Similar to POSIX gettimeofday(), gets the current system time in UTC. +void GetTimeOfDay(timeval* tv); + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_WIN_TIME_H_ diff --git a/util/win/time_test.cc b/util/win/time_test.cc new file mode 100644 index 00000000..ad0771e3 --- /dev/null +++ b/util/win/time_test.cc @@ -0,0 +1,34 @@ +// Copyright 2015 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/win/time.h" + +#include "gtest/gtest.h" + +namespace crashpad { +namespace test { +namespace { + +TEST(Time, Reasonable) { + timeval t; + GetTimeOfDay(&t); + // Assume that time's time_t return is seconds from 1970. + time_t approx_now = time(nullptr); + EXPECT_GE(approx_now, t.tv_sec); + EXPECT_LT(approx_now - 100, t.tv_sec); +} + +} // namespace +} // namespace test +} // namespace crashpad