diff --git a/util/env_posix.cc b/util/env_posix.cc index 98a4019246..fa97b6c93a 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -7,7 +7,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. -#include #include #include #include @@ -1400,13 +1399,24 @@ class PosixEnv : public Env { } virtual uint64_t NowMicros() override { - return std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()).count(); + struct timeval tv; + gettimeofday(&tv, nullptr); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; } virtual uint64_t NowNanos() override { - return std::chrono::duration_cast( - std::chrono::steady_clock::now().time_since_epoch()).count(); +#ifdef OS_LINUX + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return static_cast(ts.tv_sec) * 1000000000 + ts.tv_nsec; +#elif __MACH__ + clock_serv_t cclock; + mach_timespec_t ts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &ts); + mach_port_deallocate(mach_task_self(), cclock); +#endif + return static_cast(ts.tv_sec) * 1000000000 + ts.tv_nsec; } virtual void SleepForMicroseconds(int micros) override { usleep(micros); }