/*
 * Copyright (C) by Argonne National Laboratory
 *     See COPYRIGHT in top-level directory
 */

#include "mpl.h"

MPL_SUPPRESS_OSX_HAS_NO_SYMBOLS_WARNING;

#if MPL_TIMER_KIND == MPL_TIMER_KIND__MACH_ABSOLUTE_TIME

#include "mpl_timer_common.h"

static double wtime_mult;
static int is_initialized = 0;

int MPL_wtime_init(void)
{
    if (is_initialized)
        goto fn_exit;

    mach_timebase_info_data_t info;
    mach_timebase_info(&info);
    wtime_mult = 1.0e-9 * ((double) info.numer / (double) info.denom);
    init_wtick();

    is_initialized = 1;

  fn_exit:
    return MPL_SUCCESS;
}

int MPL_wtime(MPL_time_t * timeval)
{
    *timeval = mach_absolute_time();

    return MPL_SUCCESS;
}

int MPL_wtime_diff(MPL_time_t * t1, MPL_time_t * t2, double *diff)
{
    *diff = (*t2 - *t1) * wtime_mult;

    return MPL_SUCCESS;
}

int MPL_wtime_touint(MPL_time_t * t, unsigned int *val)
{
    *val = (unsigned int) (*t & 0xffffffffUL);

    return MPL_SUCCESS;
}

int MPL_wtime_to_ticks(MPL_time_t * t, long long int *val)
{
    *val = *t;

    return MPL_SUCCESS;
}

int MPL_wtime_todouble(MPL_time_t * t, double *val)
{
    *val = *t * wtime_mult;

    return MPL_SUCCESS;
}

int MPL_wtime_acc(MPL_time_t * t1, MPL_time_t * t2, MPL_time_t * t3)
{
    *t3 += *t2 - *t1;

    return MPL_SUCCESS;
}

int MPL_wtick(double *wtick)
{
    *wtick = tickval;

    return MPL_SUCCESS;
}

int MPL_ticks_per_second(long long int *ticks_per_second)
{
    mach_timebase_info_data_t info;
    mach_timebase_info(&info);

    /* use timebase to convert 1 billion nanoseconds to ticks */
    *ticks_per_second = (1000000000 * info.denom) / info.numer;

    return MPL_SUCCESS;
}

#endif
