All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.glassfish.flashlight.statistics.impl.TimeStatsAbstractImpl Maven / Gradle / Ivy

There is a newer version: 4.1.2.181
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2009-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package org.glassfish.flashlight.statistics.impl;

import org.glassfish.flashlight.datatree.impl.AbstractTreeNode;
import org.glassfish.flashlight.statistics.*;
import org.glassfish.flashlight.statistics.factory.AverageFactory;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @author Harpreet Singh
 */
public abstract class TimeStatsAbstractImpl extends AbstractTreeNode
        implements TimeStats {

    private Average average = AverageFactory.createAverage();


    private AtomicLong lastSampleTime = new AtomicLong(0);
    protected long startTime = 0;

    private ThreadLocalTimeStatData individualData = new ThreadLocalTimeStatData();

    private static class ThreadLocalTimeStatData extends ThreadLocal {

        private TimeStatData tsd;

        protected TimeStatData initialValue (){
            tsd = new TimeStatData ();
            return tsd;
        }
        public TimeStatData get (){
            if (tsd == null)
                tsd = new TimeStatData();
            return tsd;
        }
        
    }

    protected static final String NEWLINE = System.getProperty("line.separator");

    public double getTime() {
        return average.getAverage();
    }

    abstract public void entry();

    abstract public void exit();

    protected void postEntry(long entryTime) {
        if (startTime == 0) {
            startTime = entryTime;
        }
        this.setLastSampleTime(entryTime);
        individualData.get().setEntryTime(entryTime);
    }

    public void postExit(long exitTime) {
        TimeStatData tsd = individualData.get();
        tsd.setExitTime(exitTime);
        average.addDataPoint(tsd.getTotalTime());
    }

    public long getMinimumTime() {
        return average.getMin();
    }

    public long getMaximumTime() {
        return average.getMax();
    }

    // only for testing purposes.
    public void setTime(long time) {
        //  System.err.println ("setTime only for Testing purposes");
        individualData.get().setTotalTime(time);
        average.addDataPoint(time);
    }

    public void setReset(boolean reset) {
        average.setReset();
        individualData.get().setReset();
    }

    public long getTimesCalled() {
        return average.getSize();
    }
    // Implementations for TimeStatistic
    public long getCount() {
        return getTimesCalled();
    }

    public long getMaxTime() {
        return getMaximumTime();
    }

    public long getMinTime() {
        return getMinimumTime();
    }

    public long getTotalTime() {
        return average.getTotal();
    }

    public long getLastSampleTime() {
        return this.lastSampleTime.get();
    }

    public long getStartTime() {
        return this.startTime;
    }

    private void setLastSampleTime(long time) {
        this.lastSampleTime.set(time);
    }

    private static class TimeStatData {
        private long entryTime = 0;
        private long exitTime = 0;
        private long totalTime = 0;


        public long getEntryTime() {
            return entryTime;
        }

        public void setEntryTime(long entryTime) {
            this.entryTime = entryTime;
        }

        public long getExitTime() {
            return exitTime;
        }

        public void setExitTime(long exitTime) {
            this.exitTime = exitTime;
        }

        public long getTotalTime() {
            totalTime = exitTime - entryTime;
            return totalTime;
        }

        public void setTotalTime(long totalTime) {
            this.totalTime = totalTime;
        }
        public void setReset (){
            entryTime = 0;
            exitTime = 0;
            totalTime = 0;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy