/*
 * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package org.graalvm.visualvm.lib.jfluid.results.cpu;

import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * This class is simply a container for instrumentation timing data that needs to be passed around between
 * a number of different objects when processing CPU profiling results.
 *
 * @author Misha Dmitriev
 */
public class InstrTimingData implements Cloneable {
    final public static InstrTimingData DEFAULT = new InstrTimingData();

    // Of these variables, the xxx0 ones are used when either only absolute or only thread CPU timer is used.
    // xxx0 and xxx1 together are used only when both timers are used.
    double methodEntryExitCallTime0 = 0;
    double methodEntryExitCallTime1 = 0;
    double methodEntryExitInnerTime0 = 0;
    double methodEntryExitInnerTime1 = 0;
    double methodEntryExitOuterTime0 = 0;
    double methodEntryExitOuterTime1 = 0;
    long timerCountsInSecond0 = 1000; // default is a millisecond timer granularity; will get replaced from the calibration data
    long timerCountsInSecond1 = 1000; // default is a millisecond timer granularity; will get replaced from the calibration data

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            Logger.getLogger(InstrTimingData.class.getName()).log(Level.SEVERE, "Unable to clone " + InstrTimingData.class.getName(), e);
            return null;
        }
    }

    public InstrTimingData() {}

    //~ Methods ------------------------------------------------------------------------------------------------------------------



    public String toString() {
        String s1 = "callTime0 = " + methodEntryExitCallTime0 + ", innerTime0 = " + methodEntryExitInnerTime0
                    + ", outerTime0 = " // NOI18N
                    + methodEntryExitOuterTime0 + "\n" // NOI18N
                    + "callTime1 = " + methodEntryExitCallTime1 + ", innerTime1 = " + methodEntryExitInnerTime1
                    + ", outerTime1 = " // NOI18N
                    + methodEntryExitOuterTime1 + "\n" // NOI18N
                    + "countsInSec0 = " + timerCountsInSecond0 + ", countsInSec1 = " + timerCountsInSecond1 + "\n"; // NOI18N

        return s1;
    }
}
