tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

AwakeTimeStamp.cpp (3326B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "AwakeTimeStamp.h"
      8 
      9 #ifdef XP_WIN
     10 #  include <windows.h>
     11 #endif
     12 
     13 #include "mozilla/Assertions.h"
     14 #include "mozilla/DebugOnly.h"
     15 
     16 namespace mozilla {
     17 
     18 static constexpr uint64_t kUSperS = 1000000;
     19 static constexpr uint64_t kUSperMS = 1000;
     20 #ifndef XP_WIN
     21 static constexpr uint64_t kNSperUS = 1000;
     22 #endif
     23 
     24 double AwakeTimeDuration::ToSeconds() const {
     25  return static_cast<double>(mValueUs) / kUSperS;
     26 }
     27 double AwakeTimeDuration::ToMilliseconds() const {
     28  return static_cast<double>(mValueUs) / kUSperMS;
     29 }
     30 double AwakeTimeDuration::ToMicroseconds() const {
     31  return static_cast<double>(mValueUs);
     32 }
     33 
     34 AwakeTimeDuration AwakeTimeDuration::FromSeconds(uint64_t aSeconds) {
     35  return AwakeTimeDuration(aSeconds * 1000000);
     36 }
     37 AwakeTimeDuration AwakeTimeDuration::FromMilliseconds(uint64_t aMilliseconds) {
     38  return AwakeTimeDuration(aMilliseconds * 1000);
     39 }
     40 AwakeTimeDuration AwakeTimeDuration::FromMicroseconds(uint64_t aMicroseconds) {
     41  return AwakeTimeDuration(aMicroseconds);
     42 }
     43 
     44 AwakeTimeDuration AwakeTimeStamp::operator-(
     45    AwakeTimeStamp const& aOther) const {
     46  return AwakeTimeDuration(mValueUs - aOther.mValueUs);
     47 }
     48 
     49 AwakeTimeStamp AwakeTimeStamp::operator-(
     50    AwakeTimeDuration const& aOther) const {
     51  return AwakeTimeStamp(mValueUs - aOther.mValueUs);
     52 }
     53 
     54 AwakeTimeStamp AwakeTimeStamp::operator+(
     55    const AwakeTimeDuration& aDuration) const {
     56  return AwakeTimeStamp(mValueUs + aDuration.mValueUs);
     57 }
     58 
     59 void AwakeTimeStamp::operator+=(const AwakeTimeDuration& aOther) {
     60  mValueUs += aOther.mValueUs;
     61 }
     62 
     63 void AwakeTimeStamp::operator-=(const AwakeTimeDuration& aOther) {
     64  MOZ_ASSERT(mValueUs >= aOther.mValueUs);
     65  mValueUs -= aOther.mValueUs;
     66 }
     67 
     68 // Apple things
     69 #if defined(__APPLE__) && defined(__MACH__)
     70 #  include <time.h>
     71 #  include <sys/time.h>
     72 #  include <sys/types.h>
     73 #  include <mach/mach_time.h>
     74 
     75 AwakeTimeStamp AwakeTimeStamp::Now() {
     76  return AwakeTimeStamp(clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / kNSperUS);
     77 }
     78 
     79 AwakeTimeStamp AwakeTimeStamp::NowLoRes() { return Now(); }
     80 
     81 #elif defined(XP_WIN)
     82 
     83 // Number of hundreds of nanoseconds in a microsecond
     84 static constexpr uint64_t kHNSperUS = 10;
     85 
     86 AwakeTimeStamp AwakeTimeStamp::NowLoRes() {
     87  ULONGLONG interrupt_time;
     88  DebugOnly<bool> rv = QueryUnbiasedInterruptTime(&interrupt_time);
     89  MOZ_ASSERT(rv);
     90 
     91  return AwakeTimeStamp(interrupt_time / kHNSperUS);
     92 }
     93 
     94 AwakeTimeStamp AwakeTimeStamp::Now() {
     95  ULONGLONG interrupt_time;
     96  QueryUnbiasedInterruptTimePrecise(&interrupt_time);
     97 
     98  return AwakeTimeStamp(interrupt_time / kHNSperUS);
     99 }
    100 
    101 #else  // Linux and other POSIX but not macOS
    102 #  include <time.h>
    103 
    104 uint64_t TimespecToMicroseconds(struct timespec aTs) {
    105  return aTs.tv_sec * kUSperS + aTs.tv_nsec / kNSperUS;
    106 }
    107 
    108 AwakeTimeStamp AwakeTimeStamp::Now() {
    109  struct timespec ts = {0};
    110  DebugOnly<int> rv = clock_gettime(CLOCK_MONOTONIC, &ts);
    111  MOZ_ASSERT(!rv);
    112  return AwakeTimeStamp(TimespecToMicroseconds(ts));
    113 }
    114 
    115 AwakeTimeStamp AwakeTimeStamp::NowLoRes() { return Now(); }
    116 
    117 #endif
    118 
    119 };  // namespace mozilla