// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#include "../rust_globals.h"
#include "timer.h"

#if defined(__APPLE__)
#include <mach/mach_time.h>
#endif

uint64_t ns_per_s = 1000000000LL;

timer::timer() {
#if __WIN32__
    _ticks_per_s = 0LL;
    // FIXME (#2675): assert this works or have a workaround.
    QueryPerformanceFrequency((LARGE_INTEGER *)&_ticks_per_s);
    if (_ticks_per_s == 0LL) {
      _ticks_per_s = 1LL;
    }
#endif
    reset_us(0);
}

void
timer::reset_us(uint64_t timeout_us) {
    _start_us = time_us();
    _timeout_us = timeout_us;
}

uint64_t
timer::elapsed_us() {
    return time_us() - _start_us;
}

double
timer::elapsed_ms() {
    return (double) elapsed_us() / 1000.0;
}

int64_t
timer::remaining_us() {
    return _timeout_us - elapsed_us();
}

bool
timer::has_timed_out() {
    return remaining_us() <= 0;
}

uint64_t
timer::time_ns() {
#ifdef __APPLE__
    uint64_t time = mach_absolute_time();
    mach_timebase_info_data_t info = {0, 0};
    if (info.denom == 0) {
        mach_timebase_info(&info);
    }
    uint64_t time_nano = time * (info.numer / info.denom);
    return time_nano;
#elif __WIN32__
    uint64_t ticks;
    QueryPerformanceCounter((LARGE_INTEGER *)&ticks);
    return ((ticks * ns_per_s) / _ticks_per_s);
#else
    timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return (ts.tv_sec * ns_per_s + ts.tv_nsec);
#endif
}

uint64_t
timer::time_us() {
    return time_ns() / 1000;
}

timer::~timer() {
}
