001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.runtime;
014    
015    import org.vmmagic.pragma.Uninterruptible;
016    
017    /**
018     * Primitives from which to build interval and absolute timers.
019     */
020    @Uninterruptible
021    public class Time {
022    
023      /**
024       * Convert a long representing a time in nanoseconds into
025       * a double representing the same time in milliseconds.
026       * @param c a time in nanoseconds
027       * @return c converted to milliseconds
028       */
029      public static double nanosToMillis(long c) {
030        return (c)/1e6;
031      }
032    
033      /**
034       * Return the value of a hardware cycle counter (RDTSC on IA32, time base register on PPC).
035       * This is a very cheap, but also unreliable "timing" mechanism.
036       * There is absolutely no guarantee that the values returned from this method will
037       * either by monotonic (i.e., "time" can go backwards) or
038       * smooth ("time" can appear to move at a variable rate).
039       * This method should only be used for approximate timing in frequently executed code.
040       * We intentionally do not provide an API for converting from cycles to seconds because
041       * the conversion cannot be reliably supported on all of our platforms.
042       */
043      public static long cycles() {
044        return Magic.getTimeBase();
045      }
046    
047      /**
048       * Same semantics as java.lang.System.nanoTime();
049       * This (or java.lang.System.nanoTime) is the
050       * preferred API for VM internal timing functions.
051       * @return a monotonic timer value in nanoseconds.
052       */
053      public static long nanoTime() {
054        return SysCall.sysCall.sysNanoTime();
055      }
056    
057      /**
058       * Time in milliseconds (epoch Jan 1 1970).
059       */
060      public static long currentTimeMillis() {
061        return SysCall.sysCall.sysCurrentTimeMillis();
062      }
063    
064      public static double nanosToSecs(long nanos) {
065        return (nanos)/1E9;
066      }
067    
068      public static long secsToNanos(double secs) {
069        return (long)(secs*1E9);
070      }
071    }