/* * Copyright (C) yajin 2008 * * This file is part of the virtualmips distribution. * See LICENSE file for terms of the license. * */ #include #include #include "utils.h" #include "vp_clock.h" static int use_rt_clock; vp_clock_t *rt_clock; vp_clock_t *vm_clock; void init_get_clock (void) { use_rt_clock = 0; #if defined(__linux__) { struct timespec ts; if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) { use_rt_clock = 1; } } #endif } /*ns*/ static m_int64_t get_clock (void) { #if defined(__linux__) if (use_rt_clock) { struct timespec ts; clock_gettime (CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1000000000LL + ts.tv_nsec; } else #endif { /* XXX: using gettimeofday leads to problems if the date * changes, so it should be avoided. */ struct timeval tv; gettimeofday (&tv, NULL); return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000); } } /*ms*/ m_int64_t vp_get_clock (vp_clock_t * clock) { switch (clock->type) { case VP_TIMER_REALTIME: return get_clock () / 1000000; default: case VP_TIMER_VIRTUAL: ASSERT (0, "not support yet\n"); } return 0; } vp_clock_t *vp_new_clock (int type) { vp_clock_t *clock; clock = malloc (sizeof (vp_clock_t)); memset (clock, 0x0, sizeof (*clock)); if (!clock) return NULL; clock->type = type; return clock; }