sapling/eden/fs/utils/TimeUtil.cpp
Yedidya Feldblum 851e90c055 Remove include of glog from Range.h
Summary: [Folly] Remove include of `glog` from `Range.h`.

Reviewed By: lbrandy, Orvid

Differential Revision: D14114164

fbshipit-source-id: e227609e9214ab39ff272e44519d34f3047fe025
2019-03-01 01:43:08 -08:00

93 lines
2.9 KiB
C++

/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#include "eden/fs/utils/TimeUtil.h"
#include <glog/logging.h>
#include <folly/Format.h>
namespace facebook {
namespace eden {
std::string durationStr(std::chrono::nanoseconds duration) {
using namespace std::chrono_literals;
// This code is good enough for our use case of generating human-readable
// times in log messages. In the future we could probably be smarter at
// deciding how much precision to show in the output.
if (duration < 1us) {
return folly::sformat("{}ns", duration.count());
} else if (duration < 1ms) {
return folly::sformat("{:.3}us", duration.count() / 1000.0);
} else if (duration < 1s) {
return folly::sformat("{:.3}ms", duration.count() / 1000000.0);
} else if (duration < 1min) {
return folly::sformat("{:.3}s", duration.count() / 1000000000.0);
} else if (duration < 1h) {
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(duration);
auto remainder = duration - minutes;
return folly::sformat(
"{}m{:.3}s", minutes.count(), remainder.count() / 1000000000.0);
} else if (duration < 24h) {
auto hours = std::chrono::duration_cast<std::chrono::hours>(duration);
auto remainder = duration - hours;
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(remainder);
remainder -= minutes;
return folly::sformat(
"{}h{}m{:.3}s",
hours.count(),
minutes.count(),
remainder.count() / 1000000000.0);
} else {
using days_type =
std::chrono::duration<std::chrono::hours::rep, std::ratio<86400>>;
auto remainder = duration;
auto days = std::chrono::duration_cast<days_type>(remainder);
remainder -= days;
auto hours = std::chrono::duration_cast<std::chrono::hours>(remainder);
remainder -= hours;
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(remainder);
remainder -= minutes;
return folly::sformat(
"{}d{:02}h{:02}m{:.3}s",
days.count(),
hours.count(),
minutes.count(),
remainder.count() / 1000000000.0);
}
}
// Set of all the Comparision operators for comparing two timespec structs.
bool operator<(const timespec& a, const timespec& b) {
CHECK_LT(a.tv_nsec, 1000000000);
CHECK_LT(b.tv_nsec, 1000000000);
if (a.tv_sec == b.tv_sec) {
return a.tv_nsec < b.tv_nsec;
} else {
return a.tv_sec < b.tv_sec;
}
}
bool operator<=(const timespec& a, const timespec& b) {
CHECK_LT(a.tv_nsec, 1000000000);
CHECK_LT(b.tv_nsec, 1000000000);
if (a.tv_sec == b.tv_sec) {
return a.tv_nsec <= b.tv_nsec;
} else {
return a.tv_sec < b.tv_sec;
}
}
} // namespace eden
} // namespace facebook