blob: 19624603ecccc0fcac8ce77cf22338af84439906 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.util;
import java.util.concurrent.TimeUnit;
/** A simple timer.
*
* RTimers are started automatically when instantiated.
*
* @since solr 1.3
*
*/
public class RTimer {
public static final int STARTED = 0;
public static final int STOPPED = 1;
public static final int PAUSED = 2;
protected int state;
private TimerImpl timerImpl;
private double time;
private double culmTime;
protected interface TimerImpl {
void start();
double elapsed();
}
private static class NanoTimeTimerImpl implements TimerImpl {
private long start;
public void start() {
start = System.nanoTime();
}
public double elapsed() {
return TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
}
}
protected TimerImpl newTimerImpl() {
return new NanoTimeTimerImpl();
}
public RTimer() {
time = 0;
culmTime = 0;
timerImpl = newTimerImpl();
timerImpl.start();
state = STARTED;
}
/** Stop this timer */
public double stop() {
assert state == STARTED || state == PAUSED;
time = culmTime;
if(state == STARTED)
time += timerImpl.elapsed();
state = STOPPED;
return time;
}
public void pause() {
assert state == STARTED;
culmTime += timerImpl.elapsed();
state = PAUSED;
}
public void resume() {
if(state == STARTED)
return;
assert state == PAUSED;
state = STARTED;
timerImpl.start();
}
/** Get total elapsed time for this timer. */
public double getTime() {
if (state == STOPPED) return time;
else if (state == PAUSED) return culmTime;
else {
assert state == STARTED;
return culmTime + timerImpl.elapsed();
}
}
}