Commit 56d54ca2 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Shift monotonic_coarse_clock into Chrono.h and rename it to coarse_steady_clock

Summary: The rename is to bring it closer in line with the naming conventions in the standard library, and the move is because it doesn't make sense to have clocks defined in stop_watch.

Reviewed By: Orvid

Differential Revision: D6329551

fbshipit-source-id: 09d9a48eb47b8fd3761a1bd4350d9ca748fe1f96
parent da2c859c
......@@ -17,8 +17,12 @@
#pragma once
#include <chrono>
#include <stdexcept>
#include <type_traits>
#include <folly/Portability.h>
#include <folly/portability/Time.h>
/***
* include or backport:
* * std::chrono::ceil
......@@ -41,6 +45,35 @@ namespace chrono {
namespace folly {
namespace chrono {
namespace detail {
[[noreturn]] FOLLY_NOINLINE inline void throw_coarse_steady_clock_now_exn() {
throw std::runtime_error("Error using CLOCK_MONOTONIC_COARSE.");
}
} // namespace detail
struct coarse_steady_clock {
using rep = std::chrono::milliseconds::rep;
using period = std::chrono::milliseconds::period;
using duration = std::chrono::duration<rep, period>;
using time_point = std::chrono::time_point<coarse_steady_clock, duration>;
constexpr static bool is_steady = true;
static time_point now() {
#ifndef CLOCK_MONOTONIC_COARSE
return time_point(std::chrono::duration_cast<duration>(
std::chrono::steady_clock::now().time_since_epoch()));
#else
timespec ts;
auto ret = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
if (ret != 0) {
detail::throw_coarse_steady_clock_now_exn();
}
return time_point(std::chrono::duration_cast<duration>(
std::chrono::seconds(ts.tv_sec) +
std::chrono::nanoseconds(ts.tv_nsec)));
#endif
}
};
namespace detail {
......
......@@ -16,34 +16,14 @@
#pragma once
#include <folly/portability/Time.h>
#include <chrono>
#include <stdexcept>
#include <utility>
namespace folly {
#ifdef CLOCK_MONOTONIC_COARSE
struct monotonic_coarse_clock {
typedef std::chrono::milliseconds::rep rep;
typedef std::chrono::milliseconds::period period;
typedef std::chrono::milliseconds duration;
typedef std::chrono::time_point<monotonic_coarse_clock> time_point;
constexpr static bool is_steady = true;
#include <folly/Chrono.h>
#include <folly/portability/Time.h>
static time_point now() {
timespec ts;
auto ret = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
if (ret != 0) {
throw std::runtime_error("Error using CLOCK_MONOTONIC_COARSE.");
}
return time_point(
duration((ts.tv_sec * 1000) + ((ts.tv_nsec / 1000) / 1000)));
}
};
#else
using monotonic_coarse_clock = std::chrono::steady_clock;
#endif
namespace folly {
using monotonic_clock = std::chrono::steady_clock;
......@@ -299,8 +279,9 @@ struct custom_stop_watch {
*
* @author: Marcelo Juchem <marcelo@fb.com>
*/
template <typename Duration = monotonic_coarse_clock::duration>
using coarse_stop_watch = custom_stop_watch<monotonic_coarse_clock, Duration>;
template <typename Duration = folly::chrono::coarse_steady_clock::duration>
using coarse_stop_watch =
custom_stop_watch<folly::chrono::coarse_steady_clock, Duration>;
/**
* A type alias for `custom_stop_watch` that uses a monotonic clock as the time
......@@ -319,6 +300,6 @@ using coarse_stop_watch = custom_stop_watch<monotonic_coarse_clock, Duration>;
*
* @author: Marcelo Juchem <marcelo@fb.com>
*/
template <typename Duration = monotonic_clock::duration>
using stop_watch = custom_stop_watch<monotonic_clock, Duration>;
template <typename Duration = std::chrono::steady_clock::duration>
using stop_watch = custom_stop_watch<std::chrono::steady_clock, Duration>;
} // namespace folly
......@@ -33,7 +33,7 @@
using namespace folly;
using namespace folly::test;
using namespace std;
using namespace chrono;
using namespace std::chrono;
typedef DeterministicSchedule DSched;
typedef SharedMutexImpl<true, void, DeterministicAtomic, true>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment